Come faccio a modo trasparente comprimere / decomprimere un file come un programma scrive / legge da esso?

StackOverflow https://stackoverflow.com/questions/755144

Domanda

Ho un programma che legge e scrive molto grandi file di testo. Tuttavia, a causa del formato di questi file (sono rappresentazioni ASCII di quello che doveva essere dati binari), questi file sono in realtà molto facilmente compressi. Per esempio, alcuni di questi file sono oltre 10 GB di dimensione, ma gzip raggiunge la compressione del 95%.

Non riesco a modificare il programma ma lo spazio su disco è prezioso, quindi ho bisogno di creare un modo che può leggere e scrivere i file mentre sono in modo trasparente compressi e decompressi.

Il programma può solo leggere e scrivere file, in modo da quanto ho capito, ho bisogno di creare una named pipe sia per input e output. Alcune persone sono suggerendo un filesystem compresso, invece, che sembra che avrebbe funzionato, anche. Come faccio a fare sia il lavoro?

Informazioni tecniche: Sono su un Linux moderno. Il programma legge un file di input e di output separati. Si legge attraverso il file di input in ordine, anche se due volte. Scrive il file di output in ordine.

È stato utile?

Soluzione

Partenza zlibc:. http://zlibc.linux.lu/

Inoltre, se FUSE è un'opzione (cioè il kernel non è troppo vecchio), prendere in considerazione: compFUSEd http: // www .biggerbytes.be /

Altri suggerimenti

btrfs:

https://btrfs.wiki.kernel.org/index.php/Main_Page

fornisce supporto per abbastanza veloce "automatico trasparente compressione / decompressione" questi giorni, ed è presente (pur segnata sperimentale) nei kernel recenti.

named pipe non vi darà le operazioni full duplex, quindi sarà un po 'più complicato se è necessario fornire solo un nome di file.

Sapete se le vostre applicazioni ha bisogno di cercare attraverso il file?

Il vostro lavoro di applicazione con stdin, stdout?

Forse una soluzione è quella di creare un mini sistema di file compresso che contiene solo una cartella con i file

Dal momento che si dispone di ingresso separato e file di output è possibile effettuare le seguenti operazioni:

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

launch your program !

Ora, probabilmente otterrà nei guai con la lettura due volte in ordine di ingresso, perché non appena zcat è finito di leggere il file di input, il programma yout otterrà un segnale SIGPIPE

La soluzione corretta è probabilmente quello di utilizzare un sistema di file compressi come CompFUSE, perché allora non dovete preoccuparvi di operazioni non supportate come cercare.

In quale lingua stai usando?

Se si utilizza Java, un'occhiata a classi GZipInputStream e GZIPOutputStream nella documentazione delle API.

Se si sta utilizzando C / C ++, zlibc è probabilmente il modo migliore per andare su di esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top