Problemi di memoria durante la compressione e il trasferimento di un numero elevato di file di piccole dimensioni (1 TB in totale)


15

Ho 5 milioni di file che occupano circa 1 TB di spazio di archiviazione. Devo trasferire questi file a terzi.

Qual'è il miglior modo per farlo? Ho provato a ridurre le dimensioni utilizzando .tar.gz, ma anche se il mio computer ha 8 GB di RAM, viene visualizzato un errore "memoria di sistema insufficiente".

È la soluzione migliore per inviare i file tramite posta ordinaria?


9
Hai problemi a CREARE .tar.gzo COPIARE il file compresso risultante? Ad ogni modo, qualcosa è strano, perché nessuna operazione dovrebbe consumare più memoria solo perché i file sono grandi. Cioè, entrambe le operazioni dovrebbero essere in streaming. Si prega di includere ulteriori informazioni su quali comandi non riescono.
Celada,

1
Quanta larghezza di banda hai tu e la terza parte da risparmiare? Un ingenuo rsync potrebbe salvarti sull'affrancatura. Ma non so come funzioneranno per te "cinque milioni" di file perché rsync proverà a compilare l'elenco dei file in memoria e potrebbe se l'elenco (file 5e6)> 8 GB. E ovviamente sarà lento.
Kalvin Lee,

2
@oshirowanen Non credo che dovrebbe consumare un sacco di memoria calcolando l'elenco dei file perché sono abbastanza sicuro che tardovrebbe archiviare i file in modo incrementale mentre li elenca, senza mai costruire un elenco in memoria. Ma di nuovo, mostra l'esatto comando che stai utilizzando. Inoltre, tutti i file si trovano nella stessa directory o la struttura della directory è molto profonda?
Celada,

3
Ah sì, bene i programmi GUI sono spesso costruiti senza dare molta importanza a obiettivi come la scalabilità e la robustezza. Non mi sorprenderebbe se fosse colpa del wrapper / frontend della GUI. Crea il file usando la riga di comando e penso che troverai che funziona perfettamente.
Celada,

3
1 TB di dati richiederà almeno 22 ore per il trasferimento su una connessione a banda larga da 100 Mbit / s. Quindi, a seconda di quanta compressione ti aspetti di ottenere, la posta ordinaria potrebbe effettivamente essere l'opzione più veloce.
Dan

Risposte:


27

Ulteriori informazioni fornite nei commenti rivelano che l'OP sta utilizzando un metodo GUI per creare il .tar.gzfile.

Il software della GUI spesso include molto più spazio rispetto al software equivalente equivalente a riga di comando o esegue ulteriori attività non necessarie per il bene di alcune funzionalità "extra" come una barra di avanzamento. Non mi sorprenderebbe se il software della GUI stesse cercando di raccogliere un elenco di tutti i nomi dei file in memoria. Non è necessario farlo per creare un archivio. Gli strumenti dedicati tare gzipsono sicuramente progettato per funzionare con lo streaming di ingresso e di uscita che significa che possono trattare con ingresso e uscita molto più grande di memoria.

Se si evita il programma GUI, è molto probabile che si generi questo archivio utilizzando una chiamata quotidiana completamente normale tarcome questa:

tar czf foo.tar.gz foo

dov'è foola directory che contiene tutti i tuoi 5 milioni di file.

Le altre risposte a questa domanda ti danno un paio di tarcomandi alternativi aggiuntivi da provare nel caso in cui desideri dividere il risultato in più pezzi, ecc ...


15

"cinque milioni" di file e 1 TB in totale? I tuoi file devono essere molto piccoli, quindi. Proverei semplicemente rsync:

rsync -alPEmivvz /source/dir remote.host.tld:/base/dir

Se non lo possiedi o il tuo caso d'uso non consente l'utilizzo rsync, verificherei almeno se 7zfunziona con i tuoi dati. Potrebbe non esserlo, ma penso che valga la pena provare:

7z a archive.7z /source/dir

O se non ti senti a tuo agio con 7zalmeno prova a fare un .tar.xzarchivio:

tar cJv archive.tar.xz /source/dir

(va notato che le versioni precedenti di tarnon creano .tar.xzarchivi, ma gli .tar.lzmaarchivi, quando si utilizza l' Jopzione. Anche le versioni precedenti di tar, non supportano del Jtutto la bandiera.)


Dato che stai usando un programma GUI per creare quei file, suppongo che ti senta un po 'a disagio usando un'interfaccia a riga di comando.

Per facilitare la creazione, la gestione e l'estrazione degli archivi dall'interfaccia della riga di comando, c'è la piccola utility chiamata atool. È disponibile praticamente per tutte le distro comuni che ho visto e funziona praticamente su ogni singolo archivio su cui mi sono imbattuto, a meno di quelli irrimediabilmente oscuri.

Verifica se la tua distribuzione ha atoolnei propri repository o chiedi al tuo amministratore di installarlo, quando si trova in un ambiente di lavoro.

atool installa un gruppo di collegamenti simbolici a se stesso, quindi imballare e disimballare diventa un gioco da ragazzi:

apack archive.tar.xz <files and/or directories>

Crea un archivio.

aunpack archive.7z

Espande l'archivio.

als archive.rar

Elenca il contenuto del file.

Che tipo di archivio viene creato, lo atooldistingue dall'estensione del file del tuo archivio nella riga di comando.


4
Il vantaggio qui di usare rsyncè che se (quando) la connessione si interrompe, rsyncpuò riprendere da dove era stata interrotta.
roaima,

2
I file sarebbero in media 200 KB. Non è poi così piccolo.
Nate Eldredge,

4
@NateEldredge Di solito penso al grande come significato> 1 GB. Di solito è piccolo <1 MB. Così piuttosto piccolo.
PythonNut,

8

A meno che tu non riesca a fare una compressione migliore della 25: 1, è improbabile che tu ottenga qualcosa dalla compressione prima della posta ordinaria, a meno che tu non abbia un formato di nastro hardware che puoi scambiare con la terza parte.

Il più grande spazio di archiviazione comune è il raggio blu e che ti porterà all'incirca 40 GB. Avresti bisogno di una compressione da 25 a 1 sui tuoi dati per adattarli. Se la tua terza parte ha solo un DVD, hai bisogno di 125: 1 (approssimativamente).

Se non riesci ad abbinare quei numeri di compressione, usa un normale disco, copia e posta ordinaria a terzi. In quel caso spedire qualcosa di più piccolo di un'unità da 1 TB che avrebbe bisogno di compressione è una follia.

Devi solo confrontarlo con l'uso ssh -C(compressione standard) o preferibilmente rsynccon la compressione per copiare i file sulla rete, non è necessario comprimere e caricare in anticipo. 1 TB non è impossibile spostarsi sulla rete, ma ci vorrà del tempo.


5
+1: "non sottovalutare mai la larghezza di banda di una station wagon piena di nastri che sfrecciano lungo l'autostrada" (Andrew S. Tanenbaum). vedi en.wikipedia.org/wiki/Sneakernet
Olivier Dulac

@OlivierDulac Ho visto costrutti simili con Boeing 747 e scatole piene di CD-ROM, è incredibile che tipo di throughput puoi ottenere con quello.
Anthon,

Adoro il fatto che un pidgin abbia battuto un ISP da un colpo lungo, vedi gli esempi della pagina di Wikipedia ^^
Olivier Dulac,

6

Hai considerato torrent? Peer-to-Peer potrebbe essere la migliore opzione per un trasferimento via Internet:

  • Almeno veloce come altri trasferimenti su Internet: la tua velocità di upload determinerà la velocità di trasferimento
  • Nessuna corruzione dei dati
  • Scegli quali file trasferire per primi
  • Non è necessario ulteriore spazio di archiviazione locale / cloud
  • Gratuito

Non hai detto quale sistema operativo stavi utilizzando, ma mentre parli della compressione tar.gz, suppongo che stai usando un sistema operativo simile a GNU / Linux. Per questo suggerirò la trasmissione . È un software torrent open source che funziona su Mac e Linux. Mi piace perché gli sviluppatori si sono impegnati a renderlo nativo per tutti i client GUI che supportano: nessun linguaggio multipiattaforma.

È possibile combinare questo metodo con la compressione, tuttavia si perderà la possibilità di dare priorità alle parti del trasferimento.


Il software Torrent ha probabilmente gli stessi problemi che ha la compressione del software GUI. Memorizzare i nomi dei file in memoria, ecc. Inoltre, i file torrent devono memorizzare i metadati dei file. 5 milioni di nomi di file devono essere compressi nel file torrent.
Ayesh K,

@AyeshK Vero, ciò influirà sulle prestazioni quando si aggiunge / si crea il torrent o si controllano i checksum. Tuttavia, credo che questa sia la soluzione più stabile per il trasferimento di grandi quantità di dati.
LaX,

Secondo il maniaco del torrent, il più grande torrent mai condiviso è ~ 800 gb. File torrent singolo con la maggior parte dei file contenenti circa 33 KB. Ma 5 milioni di file ... Non ne sono sicuro.
Ayesh K,

3

7z sarebbe la mia scelta. Consente la suddivisione automatica degli archivi e supporta la compressione multi-thread. No, xznonostante ciò che dice il messaggio di aiuto. Prova con:

7za a -v100m -m0=lzma2 -mx=9 -ms=on -mmt=$THREADS archive.7z directory/

L'output è suddiviso in blocchi da 100 MB (modificarlo con l' -vinterruttore).

L'unico aspetto negativo è che 7z non conserva i metadati unix (ad es. Permessi e proprietario). Se ne hai bisogno, esegui invece l' taroutput di pipe in 7za(vedi man 7zaalcuni esempi).


1
The only real downsidema che svantaggio!
njzk2,

@ njzk2 in realtà dipende dallo scenario. Ad esempio, se stai inviando immagini di backup o dump di database, probabilmente non ti importa molto delle autorizzazioni.
Stefano Sanfilippo,

Non vedo bene il punto di usare 7z per dividere, quando puoi usare splitun file .tar.gz, e riuscire a conservare i metadati.
njzk2,

@ njzk2 si divide anche . Principalmente, ha una compressione multi-thread con LZMA2. Nessun'altra utility unix di cui sono a conoscenza la supporta. 7z ha anche una modalità di compressione non solida, che è un grande passo avanti quando è necessario accedere solo a un file specifico prima dell'avvicinamento tar.
Stefano Sanfilippo,


3

Ho cliccato con il tasto destro sulla cartella e ho fatto clic su "crea archivio" e ho selezionato l'opzione .tar.gz. La struttura delle directory è profonda, oltre 500.000 directory

Sì, buona fortuna per farlo impacchettare. E lo strumento GUI proverà a farlo sullo stesso volume, il che significa che a) hai bisogno di un altro 1 TB di spazio libero eb) lo schiacciare la testa di leggere un file e aggiungerlo all'archivio non sarà troppo salutare per l'unità.

Vedo due possibilità:

1) rsync dal tuo computer alla terza parte. L'uno o l'altro avrà bisogno di un indirizzo IP globale che non cambi spesso. L' enorme vantaggio di rsync è che se vieni interrotto per qualsiasi motivo, può riprendere da dove era stato interrotto. La copia di un tarball da 1 TB avrà esito positivo o negativo

2) acquista un'unità esterna da 1 TB, copia le cose su di essa e consegna l'unità. Alta latenza, ma larghezza di banda davvero buona quando arriva. Vari servizi di backup online per questo per il backup iniziale.



1

Ti suggerisco di usare qualcosa come:

tar -c -L 104857600 -f file1.tar -f file2.tar -f file3.tar -f file4.tar -f file5.tar -f file6.tar -f file7.tar -f file8.tar -f file9.tar -f file10.tar 
gzip file*.tar

che creerà 10 file che saranno grandi al massimo 100 GB. Ma questo non risponderebbe al tuo problema "OOM" poiché tar dovrebbe trasmettere in streaming la sua lettura / scrittura, quindi il collo di bottiglia è ovvio gzip.


0

Che ne dici di quello:

find /path | tar -T - -czf - | ssh remotehost "cd /target/dir/; tar xzf -"
  • find ricerche elenca l'albero delle directory
  • tar -T - legge l'elenco da stdin
  • -czf -crea un archivio e scrive su stdout, zgzips lo stream
  • ssh remotehost accedi a remotehost usando ssh
  • cd /target/dir/ passare alla directory di destinazione
  • tar xzf - estrarre il flusso in entrata da stdin

Simpatico snippet. Anche se penso che il suo bisogno qui sia principalmente la funzione di compressione, poiché lo scopo è "trasferire ad un amico"
mveroone,

Non creare completamente l'archivio danneggerà quando la connessione si interrompe, il che non è del tutto improbabile durante il trasferimento di 1 TB, a causa di un'interruzione della rete (ci sono ancora ISP che ti disconnettono ogni 24 ore) o altri motivi.
Jonas Schäfer,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.