Problèmes de mémoire lors de la compression et du transfert d'un grand nombre de petits fichiers (1 To au total)


15

J'ai 5 millions de fichiers qui occupent environ 1 To d'espace de stockage. Je dois transférer ces fichiers à un tiers.

Quelle est la meilleure façon de procéder? J'ai essayé de réduire la taille en utilisant .tar.gz, mais même si mon ordinateur dispose de 8 Go de RAM, j'obtiens une erreur de "mémoire système insuffisante".

La meilleure solution pour envoyer les fichiers par courrier électronique est-elle terminée?


9
Vous rencontrez des problèmes pour CRÉER un .tar.gzou pour COPIER le fichier compressé résultant? Quoi qu'il en soit, quelque chose est bizarre, car aucune des opérations ne devrait consommer plus de mémoire simplement parce que les fichiers sont volumineux. Autrement dit, les deux opérations doivent être en streaming. Veuillez inclure plus d'informations sur les commandes qui échouent exactement.
Celada

1
Combien de bande passante avez-vous et le tiers à épargner? Un rsync naïf pourrait vous faire économiser sur les frais de port. Mais je ne sais pas comment "cinq millions" de fichiers fonctionneront pour vous car rsync essaiera de créer la liste de fichiers en mémoire et pourrait si la liste (fichiers 5e6)> 8 Go. Et bien sûr, ce sera lent.
Kalvin Lee

2
@oshirowanen Je ne pense pas que cela devrait consommer beaucoup de mémoire en calculant la liste des fichiers parce que je suis sûr que je tardevrais simplement archiver les fichiers de manière incrémentale au fur et à mesure qu'ils les répertorient, sans jamais construire de liste en mémoire. Mais encore une fois, veuillez montrer la commande exacte que vous utilisez. De plus, tous les fichiers sont-ils dans le même répertoire ou la structure du répertoire est-elle très profonde?
Celada

3
Ah oui, les programmes GUI sont souvent construits sans accorder beaucoup d'importance à des objectifs tels que l'évolutivité et la robustesse. Cela ne me surprendrait pas si c'est la faute du wrapper / frontend GUI. Créez le fichier en utilisant la ligne de commande et je pense que vous constaterez que cela fonctionne très bien.
Celada

3
Il faudra au moins 22 heures pour transférer 1 To de données sur une connexion à large bande à 100 Mbit / s. Ainsi, selon le niveau de compression que vous prévoyez d'atteindre, le courrier postal peut en fait être l'option la plus rapide.
Dan

Réponses:


27

Des informations supplémentaires fournies dans les commentaires révèlent que l'OP utilise une méthode GUI pour créer le .tar.gzfichier.

Le logiciel GUI inclut souvent beaucoup plus de ballonnement que le logiciel équivalent en ligne de commande équivalent, ou effectue des tâches supplémentaires inutiles pour le plaisir de certaines fonctionnalités "supplémentaires" telles qu'une barre de progression. Cela ne me surprendrait pas si le logiciel GUI essayait de collecter une liste de tous les noms de fichiers en mémoire. Il n'est pas nécessaire de le faire pour créer une archive. Les outils dédiés taret gzipsont defintely conçus pour fonctionner avec entrée et sortie en continu ce qui signifie qu'ils peuvent faire face à l' entrée et la sortie beaucoup plus grand que la mémoire.

Si vous évitez le programme GUI, vous pouvez très probablement générer cette archive en utilisant une tarinvocation quotidienne complètement normale comme celle-ci:

tar czf foo.tar.gz foo

fooest le répertoire qui contient tous vos 5 millions de fichiers.

Les autres réponses à cette question vous donnent quelques tarcommandes alternatives supplémentaires à essayer au cas où vous voudriez diviser le résultat en plusieurs morceaux, etc ...


15

"cinq millions" de fichiers et 1 To au total? Vos fichiers doivent donc être très petits. J'essaierais simplement rsync:

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

Si vous n'en avez pas - ou que votre cas d'utilisation ne permet pas de l'utiliser rsync, je vérifierais au moins si cela 7zfonctionne avec vos données. Ce n'est peut-être pas le cas, mais je pense que cela vaut la peine d'essayer:

7z a archive.7z /source/dir

Ou si vous ne vous sentez pas à l'aise avec 7zau moins essayez de faire une .tar.xzarchive:

tar cJv archive.tar.xz /source/dir

(il convient de noter que les anciennes versions de tarne créent pas d' .tar.xzarchives, mais les .tar.lzmaarchives, lors de l'utilisation du Jcommutateur. Même les versions plus anciennes de tar, ne prennent pas Jcomplètement en charge l' indicateur.)


Puisque vous utilisez un programme GUI pour créer ces fichiers, je suppose que vous vous sentez un peu mal à l'aise en utilisant une interface de ligne de commande.

Pour faciliter la création, la gestion et l'extraction d'archives à partir de l'interface de ligne de commande, il existe le petit utilitaire appelé atool. Il est disponible pour pratiquement toutes les distributions communes que j'ai vues et fonctionne à peu près toutes les archives sur lesquelles je suis tombé, à moins que celles-ci soient désespérément obscures.

Vérifiez si votre distribution a atooldans ses référentiels ou demandez à votre administrateur de l'installer lorsqu'elle se trouve dans un environnement de travail.

atool installe un tas de liens symboliques sur lui-même, donc l'emballage et le déballage deviennent un jeu d'enfant:

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

Crée une archive.

aunpack archive.7z

Développe l'archive.

als archive.rar

Répertorie le contenu du fichier.

Quel type d'archive est créé, le atooldiscerne par l'extension de nom de fichier de votre archive dans la ligne de commande.


4
L'avantage ici de l'utilisation rsyncest que si (quand) la connexion est interrompue, elle rsyncpeut reprendre là où elle s'était interrompue.
roaima

2
Les fichiers représenteraient en moyenne 200 Ko. Ce n'est pas si petit.
Nate Eldredge

4
@NateEldredge Je pense généralement aux gros comme signifiant> 1 Go. Petit est généralement <1 Mo. Si petit.
PythonNut

8

À moins que vous ne puissiez faire mieux que la compression 25: 1, il est peu probable que vous gagniez quoi que ce soit à compresser cela avant l'envoi postal, à moins que vous n'ayez un format de bande matériel que vous pouvez échanger avec le tiers.

Le plus grand stockage commun est le rayon bleu et cela vous donnera environ 40 Go. Vous auriez besoin d'une compression de 25 à 1 sur vos données pour les adapter à cela. Si votre tierce partie ne possède que des DVD, vous avez besoin de 125: 1 (environ).

Si vous ne pouvez pas faire correspondre ces numéros de compression, utilisez simplement un disque normal, copiez-le et envoyez-le à un tiers. Dans ce cas, expédier quelque chose de plus petit qu'un lecteur de 1 To nécessitant une compression est une folie.

Il suffit de comparer cela à l'utilisation ssh -C(compression standard) ou de préférence rsyncà la compression pour copier les fichiers sur le réseau, pas besoin de compresser et de tarer à l'avance. 1 To n'est pas impossible de se déplacer sur le net, mais cela va prendre un certain temps.


5
+1: "ne sous-estimez jamais la bande passante d'un break rempli de bandes qui dévalent l'autoroute" (Andrew S. Tanenbaum). voir en.wikipedia.org/wiki/Sneakernet
Olivier Dulac

@OlivierDulac J'ai vu des constructions similaires avec des Boeing 747 et des boîtiers remplis de CD-ROM, c'est incroyable quel type de débit vous pouvez obtenir avec ça.
Anthon

J'adore qu'un pidgin bat un FAI de loin, voir les exemples de la page wikipedia ^^
Olivier Dulac

6

Avez-vous pensé à torrent? Peer-to-Peer pourrait être votre meilleure option pour un transfert sur Internet:

  • Au moins aussi rapide que les autres transferts Internet: votre vitesse de téléchargement déterminera la vitesse de transfert
  • Aucune corruption de données
  • Choisissez les fichiers à transférer en premier
  • Aucun espace de stockage local / cloud supplémentaire requis
  • Gratuit

Vous n'avez pas dit quel système d'exploitation vous utilisiez, mais en parlant de compression tar.gz, je suppose que vous utilisez un système d'exploitation semblable à GNU / Linux. Pour cela, je suggère la transmission . Il s'agit d'un logiciel torrent open source qui s'exécute sur Mac et Linux. Je l'aime parce que les développeurs ont fait un effort pour le rendre natif pour tous les clients GUI qu'ils prennent en charge: pas de langage multiplateforme.

Vous pouvez combiner cette méthode avec la compression, mais vous perdrez la possibilité de hiérarchiser les parties du transfert.


Le logiciel Torrent a probablement les mêmes problèmes de compression que le logiciel GUI. Stockage des noms de fichiers dans la mémoire, etc. De plus, les fichiers torrent doivent stocker les métadonnées des fichiers. 5 millions de noms de fichiers doivent être compressés dans le fichier torrent.
Ayesh K

@AyeshK Vrai, cela affectera les performances lors de l'ajout / création du torrent ou de la vérification des sommes de contrôle. Pourtant, je pense que c'est la solution la plus stable pour le transfert de grandes quantités de données.
LaX

Selon torrent freak, le plus grand torrent jamais partagé est ~ 800 Go. Fichier torrent unique avec la plupart des fichiers contenant environ 33K fichiers. Mais 5 millions de fichiers ... je ne suis pas sûr.
Ayesh K

3

7z serait mon choix. Il permet le fractionnement automatique des archives et prend en charge la compression multi-thread. Non, xznon, malgré ce que dit le message d'aide. Essayez avec:

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

La sortie est divisée en blocs de 100 Mo (changez-la avec le -vcommutateur).

Le seul véritable inconvénient est que 7z ne conserve pas les métadonnées Unix (par exemple les autorisations et le propriétaire). Si vous en avez besoin, canalisez la tarsortie dans 7za(voir man 7zaquelques exemples).


1
The only real downsidemais quel inconvénient!
njzk2

@ njzk2 en fait cela dépend du scénario. Par exemple, si vous envoyez des images de sauvegarde ou des vidages de base de données, vous ne vous souciez probablement pas beaucoup des autorisations.
Stefano Sanfilippo

Je ne vois pas vraiment l'intérêt d'utiliser 7z pour le fractionnement, quand vous pouvez l'utiliser splitsur un fichier .tar.gz, et arriver à conserver les métadonnées.
njzk2

@ njzk2, il se divise également . Principalement, il a une compression multi-thread avec LZMA2. Aucun autre utilitaire Unix que je connaisse ne le prend en charge. 7z a également un mode de compression non solide, ce qui est un grand pas en avant lorsque seul un fichier spécifique doit être consulté par rapport à l' tarapproche.
Stefano Sanfilippo

c'est parti
njzk2

3

J'ai fait un clic droit sur le dossier et cliqué sur "créer une archive" et sélectionné l'option .tar.gz. La structure des répertoires est profonde, plus de 500 000 répertoires

Ouais, bonne chance pour que ça soit emballé. Et l'outil GUI essaiera de le faire sur le même volume, ce qui signifie a) vous avez besoin d'un autre 1 To d'espace libre et b) le battement de tête de lire un fichier et de l'ajouter à l'archive ne sera pas trop sain pour le lecteur.

Je vois deux possibilités:

1) rsync de votre ordinateur au tiers. L'un ou l'autre aura besoin d'une adresse IP globale qui ne change pas souvent. L' énorme avantage de rsync est que si vous êtes interrompu pour une raison quelconque, il peut reprendre là où il s'était arrêté. La copie d'une archive tar de 1 To va réussir ou échouer

2) achetez un disque externe de 1 To, copiez-y les éléments et faites-vous livrer le disque. Latence élevée, mais très bonne bande passante à son arrivée. Divers services de sauvegarde en ligne pour cela pour la sauvegarde initiale.



1

Je vous suggère d'utiliser quelque chose comme:

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

ce qui créera 10 fichiers d'une taille maximale de 100 Go. Mais cela ne répondrait pas à votre problème de "MOO" car tar est censé diffuser sa lecture / écriture, donc le goulot d'étranglement est gzip de manière évidente.


0

Que diriez-vous de cela:

find /path | tar -T - -czf - | ssh remotehost "cd /target/dir/; tar xzf -"
  • find recherches répertorie l'arborescence des répertoires
  • tar -T - lit la liste depuis stdin
  • -czf -crée une archive et écrit sur stdout, zcompresse le flux
  • ssh remotehost connectez-vous à remotehost en utilisant ssh
  • cd /target/dir/ passer au répertoire cible
  • tar xzf - extraire le flux entrant de stdin

Joli petit extrait. Bien que je pense que son besoin ici est principalement la fonction de compression, car le but est de "transférer à un ami"
mveroone

La création incomplète de l'archive sera endommagée lorsque la connexion s'interrompt, ce qui n'est pas tout à fait improbable lors du transfert de 1 To, soit en raison d'une panne de réseau (il existe toujours des FAI qui vous déconnectent toutes les 24 heures) ou pour d'autres raisons.
Jonas Schäfer

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.