2009-04-16 16 views
7

Ich habe ein Programm, das sehr große Textdateien liest und schreibt. Wegen des Formats dieser Dateien (sie sind ASCII-Darstellungen von Binärdaten) sind diese Dateien jedoch sehr leicht komprimierbar. Zum Beispiel haben einige dieser Dateien eine Größe von mehr als 10 GB, aber gzip erreicht eine Komprimierung von 95%.Wie kann ich eine Datei transparent komprimieren/dekomprimieren, während ein Programm in diese schreibt/liest?

Ich kann das Programm nicht ändern, aber Speicherplatz ist wertvoll, also muss ich einen Weg einrichten, dass es diese Dateien lesen und schreiben kann, während sie transparent komprimiert und dekomprimiert werden.

Das Programm kann nur Dateien lesen und schreiben, so weit ich es verstehe, muss ich eine benannte Pipe für die Eingabe und Ausgabe einrichten. Einige Leute schlagen stattdessen ein komprimiertes Dateisystem vor, was auch so aussieht, als würde es funktionieren. Wie kann ich arbeiten?

Technische Informationen: Ich bin auf einem modernen Linux. Das Programm liest eine separate Eingabe- und Ausgabedatei. Es liest die Eingabedatei der Reihe nach zweimal durch. Es schreibt die Ausgabedatei der Reihe nach.

+0

Fühlen Sie sich frei, meine Tags zu bearbeiten. Ich fand es sehr schwierig, geeignete auszuwählen. Auch, wenn dies ein Duplikat ist, wie immer, lassen Sie es mich wissen und ich werde gerne löschen ... –

+1

Dies ist nicht mit der Programmierung verwandt, da Sie Ihr Programm nicht ändern können. Sie benötigen entweder größere Festplatten oder ein r/w-komprimiertes Dateisystem. – Alnitak

Antwort

5

Auschecken zlibc: http://zlibc.linux.lu/. Auch

, wenn FUSE ist eine Option (das heißt der Kernel ist nicht zu alt), betrachten: compFUSEd http://www.biggerbytes.be/

+0

Kann ich auch mit zlibc schreiben? Es ist genauso wichtig, dass ich als gelesen schreiben kann. –

+0

zlibc dient hauptsächlich zum Schreiben neuer Programme, die komprimieren, und Sie sagten, Sie könnten Ihr Programm nicht berühren. Ich habe dieses für die Erwähnung von compuFUSEd gewählt, das klingt wie eine gute Lösung für Ihr Problem. – unwind

+0

zlibc ist schreibgeschützt, kann aber definitiv auch ohne Neukompilierung über den LD_PRELOAD-Mechanismus verwendet werden. – EFraim

2

Named Pipes bieten keine Vollduplex-Operationen, daher wird es ein wenig komplizierter, wenn Sie nur einen Dateinamen angeben müssen.

Wissen Sie, ob Ihre Anwendungen die Datei durchsuchen müssen?

Funktioniert Ihre Anwendung mit stdin, stdout?

Vielleicht eine Lösung, die ein Mini-komprimiertes Dateisystem zu erstellen, das nur ein Verzeichnis mit Ihren Dateien

Da Sie getrennt haben Eingabe- und Ausgabedatei enthält Sie Folgendes tun können: Jetzt

mkfifo readfifo 
mkfifo writefifo 
zcat your inputfile > readfifo & 
gzip writefifo > youroutputfile & 

launch your program ! 

, Sie werden wahrscheinlich Probleme mit dem Lesen zweimal in der Reihenfolge der Eingabe bekommen, denn sobald zcat ist das Lesen der Eingabedatei, wird Ihr Programm ein Signal SIGPIPE erhalten

Die richtige Lösung ist wahrscheinlich, ein komprimiertes Dateisystem zu verwenden wie CompFUSE, denn dann müssen Sie sich nicht um nicht unterstützte Operationen wie Suchvorgänge kümmern.

+0

Ich habe meine Frage bearbeitet, um Ihre Anfragen zu bearbeiten. Das Programm liest oder schreibt stdin/out nicht. –

0

Welche Sprache spielst Du?

Wenn Sie Java verwenden, sehen Sie sich die GZipInputStream- und GZipOutputStream-Klassen im API-Dokument an.

Wenn Sie C/C++ verwenden, ist zlibc wahrscheinlich der beste Weg.

+0

Ich kann das Programm nicht ändern, also muss dies außerhalb des Programms funktionieren. Ich bin cool mit jeder Sprache, aber ich dachte, dass dies mehr mit Linux als mit Programmierung funktioniert. –