Ho un processo imbarazzantemente parallelo che crea una quantità enorme di file quasi (ma non completamente) identici. C'è un modo per archiviare i file "al volo", in modo che i dati non consumino più spazio del necessario?
Il processo stesso accetta i parametri della riga di comando e stampa il nome di ciascun file creato su stdout. Lo sto invocando con il parallel --gnu
quale si occupa di distribuire l'input (che proviene da un altro processo) e di raccogliere l'output:
arg_generating_process | parallel --gnu my_process | magic_otf_compressor
ESEMPIO SEMPLICE per la prima parte del tubo in bash
:
for ((f = 0; $f < 100000; f++)); do touch $f; echo $f; done
Come potrebbe magic_otf_compressor
apparire? Dovrebbe trattare ogni riga di input come nome file, copiare ogni file in un .tar
archivio compresso (lo stesso archivio per tutti i file elaborati!) E quindi eliminarlo. (In realtà, dovrebbe essere sufficiente stampare il nome di ciascun file elaborato, un altro | parallel --gnu rm
potrebbe occuparsi di eliminare i file.)
Esiste un tale strumento? Non sto pensando di comprimere ogni file singolarmente, questo perderebbe troppo spazio. Ho esaminato archivemount
(manterrà il file system in memoria -> impossibile, i miei file sono troppo grandi e troppi) e avfs
(non riuscivo a farlo funzionare insieme a FUSE). Cosa mi sono perso?
Sono solo a un passo dall'hacking di un tale strumento, ma qualcuno deve averlo fatto prima ...
EDIT : Essenzialmente penso di essere alla ricerca di un front-end stdin per libtar
(al contrario del front-end della riga di comando tar
che legge gli argomenti, beh, dalla riga di comando).