Problemas de memoria al comprimir y transferir una gran cantidad de archivos pequeños (1 TB en total)


15

Tengo 5 millones de archivos que ocupan aproximadamente 1 TB de espacio de almacenamiento. Necesito transferir estos archivos a un tercero.

¿Cuál es la mejor manera de hacer esto? Intenté reducir el tamaño usando .tar.gz, pero a pesar de que mi computadora tiene 8 GB de RAM, aparece un error de "memoria del sistema".

¿Es la mejor solución para enviar por correo los archivos?


99
¿Tiene problemas para CREAR .tar.gzo COPIAR el archivo comprimido resultante? De cualquier manera, algo es extraño, porque ninguna de las operaciones debería consumir más memoria solo porque los archivos son grandes. Es decir, ambas operaciones deberían estar en streaming. Incluya más información sobre exactamente qué comandos están fallando.
Celada

1
¿Cuánto ancho de banda tiene usted y el tercero de sobra? Un rsync ingenuo puede ahorrarle gastos de envío. Pero no sé cómo funcionará para usted "cinco millones" de archivos porque rsync intentará construir la lista de archivos en la memoria y podría si la lista (archivos 5e6)> 8 GB. Y, por supuesto, será lento.
Kalvin Lee

2
@oshirowanen No creo que deba consumir un montón de memoria computando la lista de archivos porque estoy bastante seguro de tarque solo debería archivar los archivos de forma incremental a medida que los enumera, nunca construyendo una lista en la memoria. Pero nuevamente, muestre el comando exacto que está utilizando. Además, ¿están todos los archivos en el mismo directorio o la estructura del directorio es muy profunda?
Celada

3
Ah, sí, los programas de GUI se crean a menudo sin dar mucha importancia a objetivos tales como la escalabilidad y la solidez. No me sorprendería si es culpa del GUI wrapper / frontend. Cree el archivo usando la línea de comando y creo que encontrará que funciona bien.
Celada

3
La transferencia de 1 TB de datos demorará al menos 22 horas en una conexión de banda ancha de 100 Mbit / s. Entonces, dependiendo de cuánta compresión espere lograr, el correo postal podría ser la opción más rápida.
Dan

Respuestas:


27

La información adicional proporcionada en los comentarios revela que el OP está utilizando un método GUI para crear el .tar.gzarchivo.

El software GUI a menudo incluye mucha más hinchazón que el software equivalente de línea de comando equivalente, o realiza tareas innecesarias adicionales en aras de alguna característica "adicional" como una barra de progreso. No me sorprendería si el software GUI está tratando de recopilar una lista de todos los nombres de archivo en la memoria. No es necesario hacer eso para crear un archivo. Las herramientas dedicadas tary gzipestán definitivamente diseñadas para trabajar con la entrada y salida de transmisión, lo que significa que pueden manejar entradas y salidas mucho más grandes que la memoria.

Si evita el programa GUI, lo más probable es que pueda generar este archivo utilizando una tarinvocación diaria completamente normal como esta:

tar czf foo.tar.gz foo

donde fooestá el directorio que contiene todos tus 5 millones de archivos.

Las otras respuestas a esta pregunta le dan un par de tarcomandos alternativos adicionales para probar en caso de que desee dividir el resultado en varias partes, etc.


15

¿"cinco millones" de archivos y 1TB en total? Sus archivos deben ser muy pequeños, entonces. Simplemente intentaría rsync:

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

Si no tiene eso, o si su caso de uso no permite su uso rsync, al menos comprobaría si 7zfunciona con sus datos. Puede que no, pero creo que todavía vale la pena intentarlo:

7z a archive.7z /source/dir

O si no se siente cómodo con 7zal menos intentar hacer un .tar.xzarchivo:

tar cJv archive.tar.xz /source/dir

(debe tenerse en cuenta que las versiones anteriores de tarno crean .tar.xzarchivos, sino .tar.lzmaarchivos, cuando se usa el Jinterruptor. Incluso las versiones anteriores de tar, no admiten la Jbandera por completo).


Dado que está utilizando un programa GUI para crear esos archivos, supongo que se siente un poco incómodo con una interfaz de línea de comandos.

Para facilitar la creación, gestión y extracción de archivos desde la interfaz de línea de comandos, existe la pequeña utilidad llamada atool . Está disponible para prácticamente todas las distribuciones comunes que he visto, y funciona prácticamente en todos los archivos con los que me he topado, a menos que los oscuros sean irremediablemente oscuros.

Compruebe si su distribución tiene atoolen sus repositorios, o pídale a su administrador que la instale, cuando esté en un entorno de trabajo.

atool instala un montón de enlaces simbólicos en sí mismo, por lo que empacar y desempacar se convierte en una brisa:

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

Crea un archivo.

aunpack archive.7z

Expande el archivo.

als archive.rar

Enumera el contenido del archivo.

Qué tipo de archivo se crea, lo atooldistingue por la extensión del nombre de archivo de su archivo en la línea de comando.


44
La ventaja de usar aquí rsynces que si (cuando) la conexión se rompe, rsyncpuede continuar donde se quedó.
roaima

2
Los archivos serían un promedio de 200 KB. Eso no es tan pequeño.
Nate Eldredge

44
@NateEldredge Normalmente pienso en grande como significado> 1GB. Pequeño suele ser <1 MB. Muy pequeño.
PythonNut

8

A menos que pueda hacer una compresión mejor que 25: 1, es poco probable que gane algo al comprimir esto antes de enviarlo por correo, a menos que tenga algún formato de cinta de hardware que pueda intercambiar con el tercero.

El almacenamiento común más grande es blue ray y eso te dará aproximadamente 40 Gb. Necesitaría una compresión de 25 a 1 en sus datos para que se ajuste a eso. Si su tercero solo tiene DVD, necesita 125: 1 (aproximadamente).

Si no puede hacer coincidir esos números de compresión, simplemente use un disco normal, copie y envíe por correo postal a un tercero. En ese caso, enviar algo más pequeño que una unidad de 1Tb que necesitaría compresión es una locura.

Solo tiene que comparar eso con el uso ssh -C(compresión estándar) o preferiblemente rsynccon la compresión para copiar los archivos a través de la red, sin necesidad de comprimir y tapar por adelantado. 1Tb no es imposible moverse por la red, pero llevará un tiempo.


55
+1: "nunca subestimes el ancho de banda de una camioneta llena de cintas que se precipitan por la carretera" (Andrew S. Tanenbaum). ver en.wikipedia.org/wiki/Sneakernet
Olivier Dulac

@ OlivierDulac He visto construcciones similares con Boeing 747 y cajas llenas de CDROM. Es sorprendente qué tipo de rendimiento puede obtener con eso.
Anthon

Me encanta que un pidgin venza a un ISP por mucho, vea los ejemplos de la página de wikipedia ^^
Olivier Dulac

6

¿Consideraste torrent? Peer-to-Peer podría ser su mejor opción para una transferencia por Internet:

  • Al menos tan rápido como otras transferencias de Internet: su velocidad de carga determinará la velocidad de transferencia
  • Sin corrupción de datos
  • Elija qué archivos transferir primero
  • No se necesita espacio adicional de almacenamiento local / en la nube
  • Gratis

No dijiste qué sistema operativo estabas usando, pero como estás hablando de la compresión tar.gz, asumiré que estás usando un sistema operativo similar a GNU / Linux. Para eso sugeriré Transmisión . Es un software de torrent de código abierto que se ejecuta en Mac y Linux. Me gusta porque los desarrolladores se esforzaron por hacerlo nativo a todos los clientes de GUI que admiten: sin lenguaje multiplataforma.

Puede combinar este método con la compresión, sin embargo, perderá la capacidad de priorizar partes de la transferencia.


El software Torrent probablemente tiene los mismos problemas que tiene el software de compresión GUI. Almacenar nombres de archivos en la memoria, etc. Además, los archivos torrent tienen que almacenar los metadatos de los archivos. Se deben empaquetar 5 millones de nombres de archivo en el archivo torrent.
Ayesh K

@AyeshK Cierto, esto afectará el rendimiento al agregar / crear el torrent o verificar las sumas de verificación. Aún así, creo que esta es la solución más estable para la transferencia de grandes cantidades de datos.
LaX

Según el monstruo del torrent, el torrent más grande jamás compartido es ~ 800gb. Un solo archivo torrent con la mayoría de los archivos contenía aproximadamente 33K archivos. Pero 5 millones de archivos ... No estoy seguro.
Ayesh K

3

7z sería mi elección. Permite la división automática de archivos y admite compresión multiproceso. No, xzno, a pesar de lo que dice el mensaje de ayuda. Probar con:

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

La salida se divide en bloques de 100 MB (cámbiela con el -vinterruptor).

El único inconveniente real es que 7z no retiene metadatos de Unix (por ejemplo, permisos y propietario). Si lo necesita, canalice la tarsalida en su 7zalugar (consulte man 7zaalgunos ejemplos).


1
The only real downsidepero que inconveniente!
njzk2

@ njzk2 en realidad depende del escenario. Por ejemplo, si está enviando imágenes de respaldo o volcados de la base de datos, probablemente no le interesen mucho los permisos.
Stefano Sanfilippo

No entiendo el punto de usar 7z para dividir, cuando puedes usar splitun archivo .tar.gz y mantener los metadatos.
njzk2

@ njzk2 también se divide. Principalmente, tiene compresión multihilo con LZMA2. Ninguna otra utilidad de Unix que conozco lo admite. 7z también tiene un modo de compresión no sólido, que es un gran paso adelante cuando solo se debe acceder a un archivo específico para el tarenfoque.
Stefano Sanfilippo


3

Hice clic derecho en la carpeta e hice clic en "crear archivo" y seleccioné la opción .tar.gz. La estructura del directorio es profunda, más de 500,000 directorios

Sí, buena suerte para que eso se empaquete. Y la herramienta GUI intentará hacerlo en el mismo volumen, lo que significa que a) necesita otro 1Tb de espacio libre yb) la agitación de leer un archivo y agregarlo al archivo no será demasiado saludable para la unidad.

Veo dos posibilidades:

1) rsync desde su computadora a la tercera parte. Uno u otro necesitará una dirección IP global que no cambie con frecuencia. La gran ventaja de rsync es que si te interrumpen por cualquier motivo, puede continuar donde lo dejó. Copiar un tarball de 1Tb tendrá éxito o fallará

2) compre una unidad externa de 1Tb, copie cosas y haga que se entregue la unidad. Alta latencia, pero muy buen ancho de banda cuando llega. Varios servicios de respaldo en línea para esto para el respaldo inicial.



1

Te sugiero que uses algo como:

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

que creará 10 archivos que tendrán un máximo de 100 GB. Pero eso no respondería a su problema de "OOM" ya que se supone que el tar transmite su lectura / escritura, por lo que el cuello de botella es obviamente gzip.


0

Qué hay sobre eso:

find /path | tar -T - -czf - | ssh remotehost "cd /target/dir/; tar xzf -"
  • find búsquedas enumera el árbol de directorios
  • tar -T - lee la lista de stdin
  • -czf -crea un archivo y escribe en stdout, zcomprime la secuencia
  • ssh remotehost iniciar sesión en remotehost usando ssh
  • cd /target/dir/ cambiar al directorio de destino
  • tar xzf - extraer el flujo entrante de stdin

Bonito y pequeño fragmento. Aunque creo que su necesidad aquí es la función de compresión principalmente, ya que el propósito es "transferir a un amigo"
mveroone

No crear completamente el archivo dañará cuando la conexión se interrumpa, lo que no es del todo improbable durante la transferencia de 1 TB, ya sea debido a la interrupción de la red (todavía hay ISP que lo desconectan cada 24 horas) u otras razones.
Jonas Schäfer

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.