Zwei dateinen gleichzeitig zeichenweise einlesen
Henny
- perl
Hallo!
Ich möchte 2 große Dateien (die gleich viel Zahlen, rund 5 Millionen, jede Textdatei hat rund 140 MB) enthalten GLEICHZEITIG ZEICHENWEISE einlesen.
Das bedeutet: Ich lese im File1 das erste Zeichen ein, dann lese ich in File 2 auch das 1. Zeichen ein. Dann vergleiche ich die beiden und verarbeite sie und schreibe das Ergebnis in ein File3. Dann lese ich aus dem File1 das zweite Zeichen ein und aus dem File2 ebenfalls das zweite. Verarbeite beide wieder und schreibe das Ergebnis in das File3. Für die restlichen rund 5 Millionen Zeichen in den Files File1 und File2 will ich genau so vorgehen.
Nun meine Frage: Kann ich zwei geöffnete Files gleichzeitig zeichneweise einlesen???
lese die Files mit diesem Code ein:
##############
while (<FILE1>) {
for $chunk (split) {
chomp($chunk);
$hoehe = $chunk/100;
}
}
##############
Eine Möglichkeit, alle Zeichen aus dem File1 zuerst in ein ARRAY zu laden, sind am "OUT OF MEMORY" gescheitert. Da ist wohl die datenmenge zu groß, habe 512 MB-RAM)
lg, Hannes
Hallo!
hab was.
zeilenweise vergleichen:
http://perlbase.xwolf.de/cgi-bin/perlbase.cgi?display=1&id=20
Datei byteweise (zeichenweise) einlesen:
http://perlbase.xwolf.de/cgi-bin/perlbase.cgi?display=1&id=25
Beides lässt sich sicher kombinieren.
hab noch was.
DB_RECNO - mit tie() ein Flatfile an ein array binden:
http://perlbase.xwolf.de/cgi-bin/perlbase.cgi?query_string=db_recno&mode=simple_text
ein solches array liegt NICHT im Speicher rum! Hab schon 200MB Files damit durchgekämmt...
Gruss, Rolf
Hallo Rolf!
danke für den TIPPPP!
Moin!
Nun meine Frage: Kann ich zwei geöffnete Files gleichzeitig zeichneweise einlesen???
Ja.
- Sven Rautenberg
... unbrauchbar *g
SCNR, Rolf
Nun meine Frage: Kann ich zwei geöffnete Files gleichzeitig zeichneweise einlesen???
Ja.
Moin!
... unbrauchbar *g
Absicht. :) Es wurde sich ja allgemein darüber beschwert, dass Regulars immer über die gestellten Fragen hinausgehend Antworten geben. Diesem Vorwurf wollte ich mich keinesfalls aussetzen.
SCNR, Rolf
You're welcome. Aber trotzdem kein Grund für TOFU! :)
Nun meine Frage: Kann ich zwei geöffnete Files gleichzeitig zeichneweise einlesen???
Ja.
- Sven Rautenberg
Moin Sven!
... unbrauchbar *g
Absicht. :) Es wurde sich ja allgemein darüber beschwert, dass Regulars immer über die gestellten Fragen hinausgehend Antworten geben. Diesem Vorwurf wollte ich mich keinesfalls aussetzen.
Hmm, verstehe ...
You're welcome. Aber trotzdem kein Grund für TOFU! :)
Danke!
But, who the fuck is TOFU!?
--Rolf
Hi,
But, who the fuck is TOFU!?
IMHO: Text Oben Fullquote Unten. STFW
E7
Hi,
But, who the fuck is TOFU!?
IMHO: Text Oben Fullquote Unten. STFW
Uuurgs. Ich werd' mich bessern, Ehrensache!
Ouh man, ich weiß doch wie das geht. Aber ich machs immer wieder fsclah.
Ich werd' mich bessern.
--Rolf
Hello,
Nun meine Frage: Kann ich zwei geöffnete Files gleichzeitig zeichneweise einlesen???
Ja.
Nein. Falsch *gg*
Mit _einem_ PHP-Script kann man die Files immer nur abwechselnd einlesen, aber niemals gleichzeitig. Selbstverständlich können beide Handles gemeinsam geöffnet bleiben...
Aber nun mal ernsthaft. Schau Dir dazu nochmal die Threads zur Performance-Diskussion an. Auch wenn man das nicht vorausberechnen kann, lohnt es trotzdem, auch einen vergleich mit blockweisem Lesen anzustellen.
Also z.B. aus den Dateien jeweils 64kByte einlesen und dann vergleichen und das ist eigentlich das Wensentliche: auch den dritten Block erst komplett wegschreiben, wenn er fertig ist.
Um CK hier nicht zu verärgern: Ich denke, wir würden beide nicht unsere Hände darauf verwetten, was wann schneller ist, aber die Chancen, dass die Blockmethode (wesentlich) schneller ist, sind sehr hoch. Also nochmals deutlicher: entweder macht es gar nichts aus, oder sie ist _wesentlich_ schneller.
Was man sich auf jeden Fall sparen kann, sind die lästigen Iterationen.
Liebe Grüße aus http://www.braunschweig.de
Tom
Hello,
Nein. Falsch *gg*
Mit _einem_ PHP-Script kann man die Files immer nur abwechselnd einlesen, aber niemals gleichzeitig. Selbstverständlich können beide Handles gemeinsam geöffnet bleiben...
Ach noch falscher... es sollte ja in PERL gemacht werden. Das könnte doch glatt sein, dass da synchronisiertes Multithreading möglich ist *ggg*
Liebe Grüße aus http://www.braunschweig.de
Tom
Hi!
Ach noch falscher... es sollte ja in PERL gemacht werden. Das könnte doch glatt sein, dass da synchronisiertes Multithreading möglich ist *ggg*
Nein, wirklich gleichzeitig geht es nur mit 2 CPUs ;-)
Grüße
Andreas
Hallo Tom,
Um CK hier nicht zu verärgern: Ich denke, wir würden beide nicht
unsere Hände darauf verwetten, was wann schneller ist, aber die
Chancen, dass die Blockmethode (wesentlich) schneller ist, sind
sehr hoch. Also nochmals deutlicher: entweder macht es gar nichts
aus, oder sie ist _wesentlich_ schneller.
Du hast es immer noch nicht verstanden.
Es gibt keinen Unterschied zwischen zeilenweisem Lesen und
blockweisem Lesen. Man liest in beiden Faellen Bloecke. Und was
schneller ist, laesst sich nicht vorraussagen: bei deinem System
moegen 64K-Bloecke am schnellsten sein, auf anderen Systemen sieht
es wieder anders aus.
Uebrigens werden nicht 64K auf einmal gelesen, sondern es wird
Pageweise gelesen, bis entweder genau oder mehr als 64K gelesen
wurden -- zumindest, wenn man Diaetlibc oder GNU Libc verwendet.
Grüße,
CK
Hello,
Du hast es immer noch nicht verstanden.
Es ist schon Scheiße, dass ich das immer noch nicht verstanden habe. Ich muss das einfach mal selber ausprobieren oder mich eben tagelang in diesen kryptischen C-Code reinarbeiten, den Du mir genannt hast.
Dann wüsste ich nämlich, was da passiert, wenn ich, sagen wir mal, in der Applikationsschicht immer 17.000 Bytes abrufe. Irgendwann ist der Buffer ja mal aufgebraucht. Wann werden denn wieviel Bytes nachgeladen vom System? Was passiert mit dem Rest? Wodurch wird die Buffergröße gesteuert? Was passiert, wenn gerade 100 User aktiv sind auf dem Server?
Auf der HDD kann das System nur ganze Cluster beschaffen. In der nächsten Schicht kann es davon schon was wegschmeißen oder auch nicht. Oder es bastelt eben immer aus zwei Clustern einen Buffer zusammen, oder... oder...---...
Das mit $_file = file() und while($_file[] = fgets() ) [Pseudecode] kann ich mangels Webserver heute leider nicht ausprobieren. Der geht erst morgen wieder. Darum hatte ich Dich gebeten, doch die Vergleichszahlen nochmal zu produzieren. (siehe anderer Thread)
Liebe Grüße aus http://www.braunschweig.de
Tom
Hallo Tom,
Dann wüsste ich nämlich, was da passiert, wenn ich, sagen wir mal,
in der Applikationsschicht immer 17.000 Bytes abrufe.
Es wird für ein fread($fd,17000) folgendes getan:
Solange keine 17000 Byte verarbeitet:
Hole soviel Bytes wie moeglich, maximal aber 17000 aus dem Puffer
und kopiere sie in den User-Buffer
Prüfe, ob der Puffer leer ist:
wenn er leer ist, hole die naechste Page aus der Datei
Kopiere die Page in den Puffer
Kehre zurueck zur Aufrufstelle
Irgendwann ist der Buffer ja mal aufgebraucht. Wann werden denn
wieviel Bytes nachgeladen vom System?
Wie das System arbeitet, weiss ich nicht. Ich bin ehrlich gesagt
auch nicht bereit, das zu pruefen, der Kernel-Code ist mir zu
aufwendig zu lesen.
Was passiert mit dem Rest?
Er bleibt im Puffer. Der Puffer wird geloescht, sobald das
Filehandle geschlossen wird.
Wodurch wird die Buffergröße gesteuert?
Bus-Breite, Architektur, etc, pp
Was passiert, wenn gerade 100 User aktiv sind auf dem Server?
Das macht nur insofern einen Unterschied, als das der Kernel dann
die Datei intern nochmal cached.
Das mit $_file = file() und while($_file[] = fgets() )
[Pseudecode] kann ich mangels Webserver heute leider nicht
ausprobieren. Der geht erst morgen wieder. Darum hatte ich Dich
gebeten, doch die Vergleichszahlen nochmal zu produzieren. (siehe
anderer Thread)
Es bringt nichts. Im ersten Fall kann es sein, dass die Datei
gecached ist oder auch nicht. Im zweiten Fall ist sie es aber mit
Sicherheit.
Grüße,
CK
Hello,
Das mit $_file = file() und while($_file[] = fgets() )
[Pseudecode] kann ich mangels Webserver heute leider nicht
ausprobieren. Der geht erst morgen wieder. Darum hatte ich Dich
gebeten, doch die Vergleichszahlen nochmal zu produzieren. (siehe
anderer Thread)Es bringt nichts. Im ersten Fall kann es sein, dass die Datei
gecached ist oder auch nicht. Im zweiten Fall ist sie es aber mit
Sicherheit.
Na ok. Für heute erstmal Dank an Dich.
Morgen kann ich meinen Testserver hoffentlich wieder quälen. Ist leider gestern das Netzteil ausgefallen. Morgen krieg ich hoffentlich ein neues. Dann werde ich mir nochmal Gedanken darüber machen.
Liebe Grüße aus http://www.braunschweig.de
Tom