Comment éditer des fichiers texte de plusieurs gigaoctets? Vim ne fonctionne pas = ([fermé]


112

Existe-t-il des éditeurs qui peuvent modifier des fichiers texte de plusieurs gigaoctets, peut-être en ne chargeant que de petites portions en mémoire à la fois? Il ne semble pas que Vim puisse le gérer = (


J'ai chargé de très gros fichiers d'acquisition de données dans vim, et il les a traités sans problème.
Rook

Selon vos besoins d'édition, vous pourrez peut-être le faire passer par quelque chose comme sed ou perl pour effectuer une recherche et un remplacement.
El Yobo

23
En fait, ce n'est pas hors sujet, de nombreux programmeurs utilisent vim, parfois en complément de l'éditeur d'interface utilisateur. Le sujet de la question concerne le vrai problème. Nous ne connaissons tous que deux de ces bons outils de l'armée suisse pour ce genre de tâche, alors ne traitez pas vim comme trop exotique ou hors site. SO est pour les gens.
Sławomir Lenart

Au lieu de le fermer, pourquoi ne pas le déplacer vers SuperUser ou Linux / Unix, ou VIM?
user1271772

Réponses:


72

Si vous êtes sur * nix (et en supposant que vous devez modifier une partie seulement du fichier (et rarement)), vous pouvez diviser les fichiers ( à l' aide de la splitcommande), les modifier individuellement ( en utilisant awk, sedou quelque chose de similaire) et les concaténer après que vous sont fait.

cat file2 file3 >> file1

10
Bon conseil. J'avais un fichier sql de 13 Go (152 000 000 lignes), et juste en utilisant "split -l 1000000" puis éditer les fichiers d'un million de lignes où je voulais avec vim fonctionnait très bien. Il a fallu 10 minutes pour les séparer. (J'ai essayé d'ouvrir le fichier original avec vim et cela a fonctionné, mais c'était trop lent pour être utilisable.)
Claes Mogren

149

Ctrl-C arrêtera le chargement du fichier. Si le fichier est assez petit, vous avez peut-être eu de la chance d'avoir chargé tout le contenu et de supprimer toutes les étapes de post-chargement. Vérifiez que tout le fichier a été chargé lors de l'utilisation de cette astuce.

Vim peut très bien gérer les fichiers volumineux. Je viens d'éditer un fichier de 3,4 Go, de supprimer des lignes, etc. Trois choses à garder à l'esprit:

  1. Appuyez sur Ctrl-C: Vim essaie initialement de lire le fichier entier, pour faire des choses comme la coloration syntaxique et le nombre de lignes dans le fichier, etc. Ctrl-C annulera cette énumération (et la coloration syntaxique), et il ne chargera que ce qui nécessaire pour afficher sur votre écran.
  2. Lecture seule: Vim démarrera probablement en lecture seule lorsque le fichier est trop volumineux pour qu'il puisse créer un fichier. copie de fichier sur laquelle effectuer les modifications. Je devais w! pour enregistrer le fichier, et c'est là que cela a pris le plus de temps.
  3. Aller à la ligne: La :115355saisie vous amènera directement à la ligne 115355, qui est beaucoup plus rapide dans ces gros fichiers. Vim semble commencer à analyser depuis le début à chaque fois qu'il charge un tampon de lignes, et maintenir la touche Ctrl-F enfoncée pour parcourir le fichier semble devenir très lent vers la fin.

Remarque - Si votre instance Vim est en lecture seule parce que vous appuyez sur Ctrl-C, il est possible que Vim n'ait pas chargé le fichier entier dans le tampon. Si cela se produit, son enregistrement ne sauvegardera que ce qui se trouve dans la mémoire tampon, pas le fichier entier . Vous pouvez vérifier rapidement avec un Gpour passer à la fin pour vous assurer que toutes les lignes de votre fichier sont présentes.


14
A été en mesure de traiter 44 gigaoctets wikipedia xml dump dans vim en utilisant ces conseils. (ctrl-c).
vancan1ty

1
J'ai essayé de lire la fin du fichier journal de 2,5 Go sur Windows. L'ouverture dans gvim entraînait une erreur de mémoire insuffisante lorsqu'elle dépassait 2 Go de mémoire allouée. En essayant l'astuce ctrl-c, cela a arrêté de charger le fichier en mémoire mais n'a permis de voir que la partie du fichier que gvim était capable de charger. Donc, plus j'attendais avant d'appuyer sur ctrl-c, plus je pouvais voir le fichier. Naviguer vers la fin du fichier ou charger le reste du fichier était impossible (ou je ne savais pas comment). Un peu décevant que vim n'ait pas été à la hauteur de la tâche: (En fin de compte, j'ai utilisé un outil dédié gratuit pour diviser le fichier en fichiers de 100 Mo.
slawek

14
Ça ne marche pas pour moi. Je charge un fichier de 3 Go, appuyez sur ctrl-c, puis le contenu s'affiche. Je peux modifier le défilement, etc. mais quand j'arrive à la fin de la partie chargée (disons 5%), il ne se chargera plus (je suis coincé avec la partie du fichier qui a été chargée initialement jusqu'au point où j'ai appuyé sur ctrl-c)
Patryk

1
Confirmé, user3338098. Si vous appuyez sur Ctrl-C et qu'il ne charge pas le fichier entier (comme d'autres l'ont mentionné), l'enregistrer ne sauvegarde que ce que vous avez chargé. C'est probablement pourquoi il entre en lecture seule en premier lieu. Je mettrai à jour mon point Readonly pour le noter.
Aaron R.

16
Suivre ces instructions m'a amené à détruire un énorme fichier que je venais de télécharger. Vous devez supprimer complètement le point 2 car il donne essentiellement des instructions qui provoquent une perte de données, que vous ne mentionnez pas avant la fin de l'article.
Neobyte

75

Ce sont peut-être des plugins qui le font s'étouffer. (coloration syntaxique, plis, etc.)

Vous pouvez exécuter vim sans plugins.

vim -u "NONE" hugefile.log

C'est minimaliste mais cela vous donnera au moins les mouvements de vi auxquels vous êtes habitué.

syntax off

en est une autre évidente. Taillez votre installation et trouvez ce dont vous avez besoin. Vous découvrirez de quoi il est capable et si vous devez accomplir une tâche par d'autres moyens.


3
Cela charge toujours le fichier entier dans la RAM ...
Totor

@Totor ouais, je diviserais le fichier en premier, mais ce paramètre vous donnerait rapidement les meilleures performances vim en désactivant les autocommandes aléatoires. C'était mon point. Les postes de travail avec une mémoire décente devraient être capables de gérer des fichiers approchant un concert.
michael

2
donc vim / vi est inutile lorsque le fichier est 10 fois la taille de la mémoire virtuelle?
user3338098

1
J'ai utilisé cette commande pour ouvrir un fichier de 250 Mo en moins de 2 secondes. Amazing
user674669

20

Une légère amélioration par rapport à la réponse donnée par @Al pachio avec la solution split + vim, vous pouvez lire les fichiers avec un glob, en utilisant efficacement des morceaux de fichiers comme tampon, par exemple

$ split -l 5000 myBigFile
xaa
xab
xac
...

$ vim xa*
#edit the files

:nw  #skip forward and write
:n!  #skip forward and don't save 

:Nw  #skip back and write
:N!  #skip back and don't save

15

Vous voudrez peut-être consulter ce plugin VIM qui désactive certaines fonctionnalités de vim dans l'intérêt de la vitesse lors du chargement de fichiers volumineux.


8

J'ai essayé de le faire, principalement avec des fichiers d'environ 1 Go lorsque je devais apporter de petites modifications à un vidage SQL. Je suis sous Windows, ce qui en fait une douleur majeure. C'est vraiment difficile.

La question évidente est "pourquoi en avez-vous besoin?" Je peux vous dire par expérience d'avoir essayé cela plus d'une fois, vous voulez probablement vraiment essayer de trouver un autre moyen.

Alors, comment faites-vous cela? Il y a plusieurs façons de procéder. Parfois, je peux obtenir vim ou nano pour ouvrir le fichier et je peux les utiliser. C'est une douleur vraiment difficile, mais cela fonctionne.

Lorsque cela ne fonctionne pas (comme dans votre cas), vous n'avez que quelques options. Vous pouvez écrire un petit programme pour apporter les modifications dont vous avez besoin (par exemple, rechercher et remplacer). Vous pouvez utiliser un programme en ligne de commande capable de le faire (peut-être que cela pourrait être accompli avec sed / awk / grep / etc?)

Si cela ne fonctionne pas, vous pouvez toujours diviser le fichier en morceaux (quelque chose comme split étant le choix évident, mais vous pouvez utiliser head / tail pour obtenir la partie que vous voulez), puis éditer la ou les parties qui en ont besoin, et recombinez plus tard.

Croyez-moi cependant, essayez de trouver un autre moyen.


3
Habituellement, sed est votre ami dans des cas comme celui-ci. Votre éditeur n'aime vraiment pas l'idée d'insérer quelques caractères en haut d'un fichier et de trouver comment pousser tout le reste vers le bas.
dkretz

@le dorfier: Ouais. J'ai utilisé sed quand je devais faire une recherche / remplacement. Quand j'ai dû supprimer quelques lignes d'un fichier comme celui-ci (quelques lignes incroyablement longues ), j'ai réussi à le faire dans vim, mais comme vous pouvez le deviner, le déplacement entre les lignes (ainsi que la suppression réelle) a pris un peu de temps (secondes + pour répondre et redessiner). Je ne voudrais pas essayer d'ajouter même quelques lettres à l'une de ces lignes.
MBCook

Exact même problème .... une instruction "using" en haut d'un script SQL pour une grande table ou un groupe de fichiers qui n'existe pas dans le système cible. J'utilise Free File Splitter pour les casser, la ligne de commande ci-dessous pour les rejoindre.
EBarr

6

Je pense qu'il est assez courant pour les éditeurs hexadécimaux de gérer des fichiers volumineux. Sous Windows, j'utilise HxD , qui prétend gérer des fichiers jusqu'à 8 EB (8 milliards de gigaoctets).


14
Je serais intéressé de savoir comment ils ont testé cela ...: P
Shadow

Sur Linux, je recommandehexedit
elig

4

J'utilise vim 7.3.3 sur Win7 x64 avec le plugin LargeFile de Charles Campbell pour gérer des fichiers texte brut de plusieurs gigaoctets. Cela fonctionne vraiment bien.

J'espère que vous venez bien.


Comment pouvez-vous désactiver le plugin? Par exemple, faire fonctionner à nouveau toutes les autres extensions telles que la mise en évidence lorsqu'un fichier est ouvert dans Vim?
hhh

3

Wow, je n'ai jamais réussi à faire étouffer vim, même avec un Go ou deux. J'ai entendu dire qu'UltraEdit (sur Windows) et BBEdit (sur Mac) sont encore plus adaptés pour des fichiers encore plus volumineux, mais je n'ai aucune expérience personnelle.




2

J'ai utilisé l'éditeur / visualiseur intégré de FAR Commander pour les fichiers journaux de très grande taille.


1

J'ai utilisé TextPad pour les gros fichiers journaux, il n'a pas de limite supérieure.


1

La seule chose que j'ai pu utiliser pour quelque chose comme ça est mon éditeur hexadécimal Mac préféré, 0XED. Cependant, c'était avec des fichiers que je considérais comme volumineux à des dizaines de mégaoctets. Je ne sais pas jusqu'où cela ira. Je suis à peu près sûr qu'il ne charge que des parties du fichier en mémoire à la fois.


0

Dans le passé, j'ai utilisé avec succès une approche de fractionnement / édition / jointure lorsque les fichiers deviennent très volumineux. Pour que cela fonctionne, vous devez savoir où se trouve le texte à modifier dans le fichier d'origine.

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.