[C] Speicherzugriffsfehler bei mehr als 186331 Zeilen

root1992

root1992

von IT-Lehrern besessen
Hallo,

ich habe mir gestern ein Programm (C) programmiert, dass sollte eine Textdatei einlesen und man kann einen Feldtrenner eingeben, z.B. TAB und die Felderanzahl, die er ausgibt.

Aus
Code:
Feld 1\tFeld 2\tFeld 3\n
Feld 4\tFeld 5\n

macht er z.B.
Code:
Feld 1\tFeld 2\n
Feld 4\tFeld 5\n

Das funktioniert.

Die Textdatei wird ein einen 2D Array gespeichert. ausgabe[Zeile][Buchstabe]. Die zwei Werte Zeile,Buchstabe werden als Positionsparameter übergeben, sowie der Name der Datei und die Anzahl der Felder und der Trenner.
Das funktioniert. Ich habe auch ein sh geschrieben, bei dem man nur Name der Datei, Anzahl der Felder und Feldtrenner übergeben muss. Den rest macht eine subshell mit wc -l bzw wc -L.

Aber ich habe eine Textdatei getestet mit 200.000 Zeilen. Bringt er mir einen Speicherzugriffsfehler. Dann bin ich immer weiter runter gegangen. Mit 186331 Zeilen funktionert es bei mir noch. Ein installscript hänge ich an.

Meine Frage: Woran könnte es liegen, dass er bei mehr als 186331 Zeilen einen Fehler bringt.

P.S.: Die Datei ist die INSTALL.sh.txt, das txt sollte entfernt werden, dann ist es ein gewöhnliches sh, dass das C-Programm und das SH erstellt.
 

Anhänge

  • INSTALL.sh.txt
    3 KB · Aufrufe: 5
Ja, dein Speicher ist halt alle.

Entweder du weist mehr Speicher zu oder liest halt nur häppchenweise ein.
 
Wie kann ich denn dem Programm mehr Speicher zuweisen? (Benutze Debian Sarge). Denn die Arraygröße lege ich ja mit Positionsparametern fest. Oder sollte ich es mal mit maloc() (so resaviert man doch Speicher) versuchen, ob das einen Fehler zurück gibt.
 
Du solltest Speicher fuer Array immer mit malloc() reservieren.
 
Da Du eh' mit festen Größen arbeitest, könntest Du Deinen Paramter "ausgabe" ja auch in eine externe Datei auslagern. Auch wenn Du malloc verwendest, wird die nächste Datei mit 300.000 Zeilen evtl. auch wieder an die Grenzen stossen - oder auf einem anderen Rechner vorher schon aufgeben ...

Schreib eine Funktion write_ausgabe() und eine read_ausgabe(), per fseek kannst Du dort auch prima auf bestimmte Elemente zugreifgen.

Hier FreeBSD gibt es auch 'limit', mit dem Prozesse "beschnitten" werden:
cosinus:~> limit
cputime unlimited
filesize unlimited
datasize 1048576 kbytes
stacksize 131072 kbytes
coredumpsize unlimited
memoryuse unlimited
vmemoryuse unlimited
descriptors 11095
memorylocked unlimited
maxproc 5547
sbsize unlimited

Gibt es das unter linux auch ?

Heiko
 
Das gibt's auch unter Linux in aehnlicher Form ueber die limits.conf.
 
Ich habe es gelöst. Danke für euere Vorschläge. Aber ich habe es so gelöst, dass ich ein Zeichen einlese und es gar nicht in einem andrem Array zwischenspeichere. So abe ich einen 1D-Array. Ich hänge das INSTALL-skript ran, wens interessiert. Ich habe eine Testdatei mit 1.000.000 Zeilen getestet, funktioniert.

Und ich brauche für das C-Programm nur noch 30 Zeilen.
 

Anhänge

  • INSTALL.sh.txt
    2,8 KB · Aufrufe: 4

Ähnliche Themen

[Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter

Queue für copy Script

Zeilen löschen und ersetzen mit sed

Ausgabe in *.txt Datei & Struct

Speicherproblem?

Zurück
Oben