Verknüpfen von großen Dateien, Piping und Bonus

Es wurden ähnliche Fragen gestellt (und beantwortet), aber niemals wirklich zusammen, und ich kann nicht scheinen, etwas zu arbeiten. Da ich gerade mit Python anfange, wäre etwas einfach zu verstehen, wäre toll!

Ich habe 3 große Datendateien (> 500G), die ich zu entpacken, zu verketten, zu einem Teilprozeß zu putzen und dann diese Ausgabe an einen anderen Teilprozess weiterleiten soll. Ich muss dann diese endgültige Ausgabe verarbeiten, die ich in Python gerne machen möchte. Beachten Sie, ich brauche nicht die entpackte und / oder verkettete Datei außer für die Verarbeitung – die Schaffung eines Ich denke, wäre eine Verschwendung von Raum. Hier habe ich bis jetzt …

import gzip from subprocess import Popen, PIPE #zipped files zipfile1 = "./file_1.txt.gz" zipfile2 = "./file_2.txt.gz" zipfile3 = "./file_3.txt.gz" # Open the first pipe p1 = Popen(["dataclean.pl"], stdin=PIPE, stdout=PIPE) # Unzip the files and pipe them in (has to be a more pythonic way to do it - # if this is even correct) unzipfile1 = gzip.open(zipfile1, 'wb') p1.stdin.write(unzipfile1.read()) unzipfile1.close() unzipfile2 = gzip.open(zipfile2, 'wb') p1.stdin.write(unzipfile2.read()) unzipfile2.close() unzipfile3 = gzip.open(zipfile3, 'wb') p1.stdin.write(unzipfile3.read()) unzipfile3.close() # Pipe the output of p1 to p2 p2 = Popen(["dataprocess.pl"], stdin=p1.stdout, stdout=PIPE) # Not sure what this does - something about a SIGPIPE p1.stdout.close() ## Not sure what this does either - but it is in the pydoc output = p2.communicate()[0] ## more processing of p2.stdout... print p2.stdout 

Irgendwelche Vorschläge würden sehr geschätzt. * Als Bonus-Frage … das Pydoc für Lesen () sagt das:

"Beachten Sie auch, dass im nicht blockierenden Modus weniger Daten als das, was angefordert wurde, zurückgegeben werden können, auch wenn kein Größenparameter angegeben wurde."

Das scheint beängstigend Kann jemand es interpretieren? Ich möchte nicht nur einen Teil eines Datensatzes lesen, der denkt, dass es das Ganze ist. Ich dachte, die Größe der Datei zu verlassen war eine gute Sache, besonders wenn ich die Größe der Datei nicht kenne.

Vielen Dank,

GK

One Solution collect form web for “Verknüpfen von großen Dateien, Piping und Bonus”

Das wichtigste zuerst; Ich denke, du hast deine Modi falsch:

 unzipfile1 = gzip.open(zipfile1, 'wb') 

Dies sollte zipfile1 zum Schreiben öffnen und nicht lesen. Ich hoffe deine Daten existieren noch.

Zweitens wollen Sie nicht versuchen, mit den gesamten Daten auf einmal zu arbeiten . Sie sollten mit den Daten in Blöcken von 16k oder 32k oder etwas arbeiten. (Die optimale Größe variiert je nach Faktoren, macht es konfigurierbar, wenn diese Aufgabe oft getan werden muss, also können Sie mal verschiedene Größen haben.)

Was du suchst ist wohl eher wie dieser ungetestete Pseudocode:

 while (block = unzipfile1.read(4096*4)): p1.stdin.write(a) 

Wenn du versuchst, mehrere Prozesse in einer Pipeline in Python zusammenzuhängen, dann wird es wahrscheinlich eher so aussehen:

 while (block = unzipfile1.read(4096*4)): p1.stdin.write(a) p2.stdin.write(p1.stdout.read()) 

Dies gibt die Ausgabe von p1 bis p2 so schnell wie möglich. Ich habe die Annahme gemacht, dass p1 nicht wesentlich mehr Input generieren wird, als es gegeben wurde. Wenn die Ausgabe von p1 zehnmal größer als die Eingabe ist, dann solltest du eine andere Schleife ähnlich wie diese machen.


Aber ich muss sagen, das fühlt sich an wie eine Menge zusätzliche Arbeit, um das Shell-Skript zu replizieren:

 gzip -cd file1.gz file2.gz file3.gz | dataclean.py | dataprocess.pl 

gzip(1) wird automatisch die dataclean.py Datenübertragung verarbeiten, wie ich oben beschrieben habe, und unter der Annahme, dass Ihre dataclean.py und dataprocess.pl Scripts auch mit Daten in Blöcken arbeiten, anstatt vollständige Lesevorgänge durchzuführen (als Ihre ursprüngliche Version dieses Skripts Tut), dann sollten sie alle parallel in der Nähe der besten ihrer Fähigkeiten laufen.

  • Python Regex: Wie kann man einen negativen Lookahead mit einem String machen, der nicht sofort startet?
  • Lesen von seriellen Daten in Echtzeit in Python
  • Warum gibt str (float) mehr Ziffern in Python 3 als Python 2 zurück?
  • Wie berechne ich die Ableitung eines Arrays in Python
  • Google App Engine - Erste Schritte mit Python 2.7
  • Python 2.7 str (055) gibt "45" anstelle von 055
  • Genres und Typen Filter funktionieren nicht in Soundcloud API?
  • Generator als Funktionsargument
  • Ffmpeg Python Subprocess Error hat den Nicht-Null-Exit-Status 1 zurückgegeben
  • Wie kann man mit SQLAlchemy innere Verknüpfung erreichen?
  • Brauchen Sie Hilfe bei der Suche nach einem Weg mit einem Satz, der eine Liste zurückgibt, die nur einmal in einer Weile immer noch die Reihenfolge aufbewahren?
  • Python ist die beste Programmiersprache der Welt.