2017-08-28 5 views
0

Ich habe eine große Anzahl von komprimierten HDF-Dateien, die ich lesen muss.Python: Lesen Sie komprimierte (.gz) HDF-Datei ohne zu schreiben und unkomprimierte Datei zu speichern

file1.HDF.gz 
file2.HDF.gz 
file3.HDF.gz 
... 

ich in unkomprimierter HDF-Dateien mit dem folgenden Verfahren

from pyhdf.SD import SD, SDC 
import os 

os.system('gunzip <file1.HDF.gz> file1.HDF') 
HDF = SD('file1.HDF') 

und wiederholen Sie dies für jede Datei lesen kann. Dies ist jedoch zeitaufwendiger als ich es möchte.

Ich denke, es ist möglich, dass die meiste Zeit Überhang aus dem Schreiben der komprimierten Datei in eine neue unkomprimierte Version kommt, und dass ich es beschleunigen könnte, wenn ich einfach in der Lage wäre, eine unkomprimierte Version der Datei zu lesen SD Funktion in einem Schritt.

Bin ich in diesem Denken richtig? Und wenn ja, gibt es eine Möglichkeit zu tun, was ich will?

+0

Das umständlich ist. Die korrekte Verwendung wäre die transparente Komprimierung innerhalb von hdf (Sie müssen also beim Schreiben und Lesen nicht darauf achten)! Diese Konfiguration, die Sie beschreiben, ist nur für die Archivierung geeignet (da Komprimierung eine zusätzliche Ebene ist, von der hdf nichts weiß). Sie haben Ihren Anwendungsfall nicht angegeben, aber in einigen Fällen (Sie möchten viele Iterationen daraus lesen): Transformieren Sie jedes mit Komprimierung in ein neues hdf (oder dekomprimieren Sie einfach, wenn der Speicher kein Problem darstellt)! ** Bemerkung ** Python unterstützt auch viele Dekomprimierungswerkzeuge ohne Ihre dateibasierte Pipeline. – sascha

+0

Man müsste sich wirklich die Details von 'pyhdf' ansehen, um hier eine gute Antwort zu haben - man kann ein dateiähnliches Objekt erhalten, das einem gezippten Stream in Python entspricht, aber wissen müsste, ob ein dateiähnliches Objekt ist Gut genug oder wenn die pyhdf-Bibliothek eine echte Datei benötigt (oder, schlimmer noch, einen Dateinamen, damit sie die Datei selbst öffnen kann). –

+0

(selbst wenn es wirklich einen Dateinamen wünscht, könnte man Tricks mit FIFOs * spielen, wenn * pyhdf nicht benötigt, dass seine Eingabedateien suchbar sind, aber wiederum, das ist ein bisschen Untersuchung, die man in die Details davon machen müsste Implementierung der Bibliothek). –

Antwort

3

Dies ist laut pyhdf package documentation nicht möglich.

__init__(self, path, mode=1) 
    SD constructor. Initialize an SD interface on an HDF file, 
    creating the file if necessary. 

Es gibt keine andere Möglichkeit, ein SD-Objekt zu instanziieren, das ein dateiähnliches Objekt verwendet. Dies liegt wahrscheinlich daran, dass sie einer externen Schnittstelle (NCSA HDF) entsprechen. Das HDF-Format verarbeitet normalerweise auch massive Dateien, die nicht gleichzeitig speicherbar sind.

Das Entpacken als Datei ist wahrscheinlich die performanteste Option.

Wenn Sie Aufenthalt in Python möchten, verwenden Sie das gzip-Modul (docs):

import gzip 
import shutil 
with gzip.open('file1.HDF.gz', 'wb') as f_in, open('file1.HDF', 'rb') as f_out: 
    shutil.copyfileobj(f_in, f_out) 
0

sascha ist richtig, dass transparent Kompression hdf angemessenere ist als Gzipping, dennoch, wenn Sie nicht wie die hdf-Dateien gespeichert sind, steuern können Sie für den gzip Python modulue (docs) suchen sie die Daten aus diesen Dateien erhalten.

+0

Können Sie mir ein Beispiel geben, wie Sie in diesem Fall das gzip-Modul verwenden? – hm8

+0

@ hm8 Was ist los mit den offiziellen Dokumenten? – sascha

+0

Es wird erwartet, dass eine Antwort * die Frage beantwortet *, nicht jemanden darauf hinweist, wo sie eine Antwort finden kann. Links sollten ergänzend sein, nicht Kern der Antwort selbst. –

Verwandte Themen