PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sehr grosse Dateien zeilenweise lesen.



Goere
23-08-2006, 16:57
Hallo zusammen,

ich sitze hier gerade vor einen etwas doofen Problem. Wir haben perl 5.6 auf einer Win2k3 Server maschine mit 8 CPUs und 16 GB Ram.
Ich möchte mit Perl einige große (!) Text-dateien (genauer: csv) Files verarbeiten. Dabei würde ich gerne zeilenweise lesen. das Problem mit der allgemein üblichen Methode:



open OUTFH, ">$outfile";
open INFILE, "$infile";

while (<INFILE>) {
print OUTFH ....;
}


das mir Perl mit einem "Out of memory" kommt. Ichdenke, es versucht die datei komplett in ein Array zuladen und dieses dann iterativ durchzugehen. Die files sind aber ab 900 MB gross aufwärts bis derzeit 1,1 GB. Kann aber auch mehr werden. daher wohl der Memory Error. Perl kann wohl nur 2 GB raum nutzen?

Gibt es eine Möglichkeit, Perl zu sagen, wirklich nur eine Zeile im Speicher zu halten?

ich bin Euch jetzt schon dankbar!

Eure Göre.

Mehlwurm
24-08-2006, 07:20
keine lösung, aber vielleicht eine umgehung wäre es, wenn du perl (ich hab keine ahnung von perl ;-) sagst es soll die dateien alle 100, 400 oder 1000 Zeilen in seperate Dateien zerlegen und auf die kannst du dann, wie bisher zugreifen?

nur eine idee :)

Dellerium
24-08-2006, 08:21
Vorab - Mein Perl ist nen bissel eingerostet.

Konnte man nicht nach dem öffnen der Dateien den "Cursor" innerhalb der Datei setzten? Ich meine mit seek. Afair sollte man damit immer einen Teil einlesen können und nach der Verarbeitung den Cursor auf die neue Position setzen können.
Wenn mann dann immer nur ein paar tausend Zeilen einliest und anschliessend den Speicher wieder freigibt sollte sich das Problem umgehen lassen.

Wie gesagt.. ist ne Weile her bei mir :(

michael.sprick
24-08-2006, 15:05
Ich bin mir nicht mehr ganz sicher, aber ich meine, auch bei Perl ist (wie in C) die Größe eines Arrays begrenzt durch den Speicher, der als einzelner Block zur Verfügung steht.

16GB insgesamt nützt also nix, wenn der Inhalt stark fragmentiert ist.

Zur Lösung Deines Problems schau mal in:



perldoc perlopentut
perldoc -f sysread


mit sysread kannst du Byteweise vom Filehandle lesen ;)