Schreibe asynchron zur Datei in Perl

8

Grundsätzlich möchte ich:

  1. Liest eine große Menge von Daten aus dem Netzwerk in ein Array in den Speicher.
  2. Schreiben Sie diese Array-Daten asynchron und führen Sie sie durch bzip2, bevor sie auf die Festplatte trifft.

wiederhole ..

Ist das möglich? Wenn das möglich ist, weiß ich, dass ich irgendwie den nächsten Durchlauf von Daten in ein anderes Array lesen muss, da die AIO-Dokumente sagen, dass dieses Array nicht geändert werden darf, bevor das asynchrone Schreiben abgeschlossen ist. Ich würde gerne alle meine Schreibvorgänge in die Festplatte schreiben, damit der bzip2-Durchlauf viel länger dauert als das Lesen des Netzwerks.

Ist das machbar? Unten ist ein einfaches Beispiel für das, was ich denke, aber das liest nur eine Datei in Array @a zum Testen.

%Vor%     
Stefhen 12.04.2010, 00:32
quelle

2 Antworten

2
  

Schreiben Sie diese Array-Daten asynchron

FYI, write () s sind eigentlich immer asynchron. Es sei denn, Sie füllen natürlich den Schreibcache des Betriebssystems.

Sie würden sehr wenig von der Verwendung des AIO im Vergleich zum Starten einer einfachen Pipe, z. B. ungeprüft, erhalten:

%Vor%

Unter den meisten Betriebssystemen ist es sehr schwierig, solche Informationsmengen zu generieren, die den Schreib-Cache füllen. Least mit bzip2 in pipe-line: HDDs Durchsatz ist viel höher (& gt; 50 MB / s) als Kompressionsleistung (im Bereich von Megabyte pro Sekunde).

Wenn Sie es im Hintergrund ausführen möchten oder mehrere Streams parallel haben, haben Sie keine Angst zu fork () und verwenden Sie exit () von Kind, um dem Hauptprogramm zu signalisieren, wie die Operation weiterging.

Nach meiner Kenntnis ist der nützlichste (und wahrscheinlich nur nützliche) Aspekt von AIO das asynchrone Lesen. Das kann auf keine andere Weise erreicht werden. Es ist sehr wenig sinnvoll, AIO nur für asynchronen Schreibzugriff zu verwenden.

    
Dummy00001 09.06.2010 15:18
quelle
0

Sie könnten daran interessiert sein, wie Perlbelt solche Vorgänge abwickelt. Ich glaube, es verwendet Danga :: Socket , um etwas zu erreichen, das dem, was du machen willst, sehr ähnlich ist.

>     
Nick Gerakines 11.05.2010 18:35
quelle

Tags und Links