Henny: Zwei dateinen gleichzeitig zeichenweise einlesen

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

  1. 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

    --
    KnowHow veröffentlichen statt Patentieren!
    1. Hallo Rolf!

      danke für den TIPPPP!

  2. Moin!

    Nun meine Frage: Kann ich zwei geöffnete Files gleichzeitig zeichneweise einlesen???

    Ja.

    - Sven Rautenberg

    1. ... unbrauchbar *g

      SCNR, Rolf

      Nun meine Frage: Kann ich zwei geöffnete Files gleichzeitig zeichneweise einlesen???

      Ja.

      --
      Von der Sowjetunion lernen heißt Siegen lernen.
      1. 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

        1. 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

          --
          Bei uns gibts heute Erbsensuppe.
          1. Hi,

            But, who the fuck is TOFU!?

            IMHO: Text Oben Fullquote Unten. STFW

            E7

            1. 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

              --
              Doof bin ich nicht. Aber alt. So alt wie ich bin wird kein Schwein.
    2. 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

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. 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

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. 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

          --
          SELFHTML Feature Artikel: http://aktuell.de.selfhtml.org/artikel/
      2. 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

        --
        Der Mund ist das Portal zum Unglück.
        http://wwwtech.de/
        1. 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

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          1. 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

            --
            Unsere Vorstellungen von der Ewigkeit sind genauso nuetlich wie die Mutmassungen eines Kuehkens ueber die Aussenwelt bevor es die Eierschale aufbricht.
            http://wwwtech.de/
            1. 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

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau