Como editar arquivos de texto de vários gigabytes? Vim não funciona = ([fechado]


112

Existem editores que podem editar arquivos de texto de vários gigabytes, talvez carregando apenas pequenas partes na memória de uma vez? Não parece que o Vim pode lidar com isso = (


Eu carreguei arquivos de aquisição de dados realmente grandes no vim, e ele os manipulou sem problemas.
Torre de

Dependendo de suas necessidades de edição, você pode apenas canalizá-lo por meio de algo como sed ou perl para fazer uma pesquisa e substituir.
El Yobo

23
Na verdade, não está fora do assunto, muitos programadores usam o vim, às vezes como um complemento ao editor de IU. A questão do tópico é sobre o problema real. Todos nós conhecemos apenas duas boas ferramentas do exército suíço para esse tipo de tarefa, então, por favor, não trate o vim como muito exótico ou remoto. ASSIM é para pessoas.
Sławomir Lenart

Em vez de fechá-lo, por que não movê-lo para SuperUser ou Linux / Unix ou VIM?
user1271772

Respostas:


72

Se você estiver em * nix (e supondo que você tem que modificar somente partes do arquivo (e raramente)), você pode dividir os arquivos (usando o splitcomando), editá-los individualmente (usando awk, sedou algo similar) e concatenar-los depois de estão prontos.

cat file2 file3 >> file1

10
Ótima dica. Eu tinha um arquivo sql de 13 GB (152.000.000 linhas), e apenas usando "split -l 1000000" e depois editar os arquivos de um milhão de linhas onde eu queria com o vim funcionou muito bem. Demorou 10 minutos apenas para separá-los. (Eu tentei abrir o arquivo original com o vim e funcionou, mas era muito lento para ser utilizável.)
Claes Mogren

149

Ctrl-C interromperá o carregamento do arquivo. Se o arquivo for pequeno o suficiente, você pode ter tido a sorte de carregar todo o conteúdo e simplesmente eliminar todas as etapas de pós-carregamento. Verifique se todo o arquivo foi carregado ao usar esta dica.

O Vim pode lidar muito bem com arquivos grandes. Acabei de editar um arquivo de 3,4 GB, excluindo linhas, etc. Três coisas para manter em mente:

  1. Pressione Ctrl-C: o Vim tenta ler todo o arquivo inicialmente, para fazer coisas como realce de sintaxe e número de linhas no arquivo, etc. Ctrl-C irá cancelar esta enumeração (e o realce de sintaxe), e só carregará o que está necessário para exibir na tela.
  2. Somente leitura: o Vim provavelmente iniciará somente leitura quando o arquivo for muito grande para que ele faça um. cópia do arquivo para realizar as edições. Eu tive que w! para salvar o arquivo, e foi quando demorou mais.
  3. Vá para a linha: a digitação :115355o levará diretamente para a linha 115355, que é muito mais rápida em arquivos grandes. O Vim parece começar a escanear do início toda vez que carrega um buffer de linhas, e manter pressionado Ctrl-F para escanear o arquivo parece ficar muito lento perto do fim.

Nota - Se a sua instância do Vim estiver somente leitura porque você pressionou Ctrl-C, é possível que o Vim não carregue o arquivo inteiro no buffer. Se isso acontecer, salvá-lo salvará apenas o que está no buffer, não o arquivo inteiro . Você pode verificar rapidamente com um Gpara pular para o final e certificar-se de que todas as linhas do arquivo estão lá.


14
Foi capaz de lidar com 44 gigabytes de despejo xml da wikipedia no vim usando este conselho. (ctrl-c).
vancan1ty

1
Tentei ler o final do arquivo de log de 2,5 GB no Windows. A abertura em gvim resultou em erro de falta de memória quando excedeu 2 GB de memória alocada. Ao tentar o truque do ctrl-c, ele parou de carregar o arquivo na memória, mas só permitiu ver a parte do arquivo que o gvim foi capaz de carregar. Portanto, quanto mais eu esperava antes de pressionar ctrl-c, mais do arquivo eu podia ver. Navegar até o final do arquivo ou carregar o restante do arquivo era impossível (ou não sabia como). Um tanto decepcionante que o vim não estava à altura da tarefa: (No final, usei uma ferramenta gratuita dedicada para dividir o arquivo em arquivos de 100 MB.
slawek

14
Não funciona para mim. Carrego um arquivo de 3 GB, pressiono ctrl-ce o conteúdo aparece. Posso editar scroll etc, mas quando chego ao final da parte carregada (digamos 5%) não carrega mais (estou preso com a parte do arquivo que carregou inicialmente até o ponto em que pressionei ctrl-c)
Patryk

1
Confirmado, user3338098. Se você pressionar Ctrl-C e ele não carregar o arquivo inteiro (como outros já falaram), salvá-lo salva apenas o que você carregou. É provavelmente por isso que ele vai para somente leitura em primeiro lugar. Vou atualizar meu ponto somente leitura para observar isso.
Aaron R.

16
Seguir essas instruções me fez destruir um arquivo enorme que acabei de baixar. Você precisa remover completamente o ponto 2, pois ele basicamente dá instruções que causam perda de dados, que você não menciona até o final do post.
Neobyte de

75

Podem ser plug-ins que estão causando a obstrução. (destaque de sintaxe, dobras, etc.)

Você pode executar o vim sem plug-ins.

vim -u "NONE" hugefile.log

É minimalista, mas pelo menos vai lhe dar os movimentos vi que você está acostumado.

syntax off

é outro óbvio. Remova sua instalação e forneça o que você precisa. Você descobrirá do que ele é capaz e se precisa realizar uma tarefa por outros meios.


3
Isso ainda carrega todo o arquivo na RAM ...
Totor

@Totor sim, eu dividiria o arquivo primeiro, mas essa configuração rapidamente forneceria o melhor desempenho do vim desativando os comandos automáticos aleatórios. Esse foi o meu ponto. As estações de trabalho com memória decente devem ser capazes de lidar com arquivos que se aproximam de um show.
michael

2
então vim / vi é inútil quando o arquivo é 10 vezes o tamanho da memória virtual?
user3338098

1
Usei este comando para abrir um arquivo de 250 MB em menos de 2 segundos. Incrível
user674669 de

20

Uma ligeira melhoria na resposta dada por @Al pachio com a solução split + vim, você pode ler os arquivos com um glob, efetivamente usando pedaços de arquivo como buffer, por exemplo

$ 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

Você pode querer verificar este plugin VIM que desabilita certos recursos do vim para aumentar a velocidade ao carregar arquivos grandes.


8

Tentei fazer isso, principalmente com arquivos em torno de 1 GB, quando precisei fazer algumas pequenas alterações em um dump SQL. Estou no Windows, o que o torna um grande problema. É muito difícil.

A pergunta óbvia é "por que você precisa?" Posso dizer por experiência própria, tendo que tentar isso mais de uma vez, você provavelmente deseja realmente tentar encontrar outra maneira.

Então como você faz isso? Existem algumas maneiras de fazer isso. Às vezes consigo fazer o vim ou o nano abrir o arquivo e posso usá-los. É uma dor muito forte, mas funciona.

Quando isso não funcionar (como no seu caso), você tem apenas algumas opções. Você pode escrever um pequeno programa para fazer as alterações de que precisa (por exemplo, pesquisar e substituir). Você pode usar um programa de linha de comando que pode fazer isso (talvez pudesse ser feito com sed / awk / grep / etc?)

Se isso não funcionar, você sempre pode dividir o arquivo em partes (algo como dividir sendo a escolha óbvia, mas você pode usar head / tail para obter a parte que deseja) e, em seguida, editar as partes que precisam, e recombinar mais tarde.

Confie em mim, tente encontrar outra maneira.


3
Normalmente sed é seu amigo em casos como este. Seu editor realmente não gosta da ideia de inserir alguns caracteres no início de um arquivo e descobrir como empurrar todo o resto para baixo.
dkretz

@le dorfier: Sim. Usei o sed quando tive que fazer uma busca / substituição. Quando eu tive que deletar algumas linhas de um arquivo como aquele (algumas linhas absurdamente longas ) eu consegui fazer isso no vim, mas como você pode imaginar, mover entre as linhas (assim como deletar) demorou um pouco (segundos + para responder e redesenhar). Eu não gostaria de tentar adicionar nem mesmo algumas letras a uma dessas linhas.
MBCook

Exatamente o mesmo problema ... uma instrução "usando" no início de um script SQL para uma grande tabela ou um grupo de arquivos que não existe no sistema de destino. Eu uso o Free File Splitter para eliminá-los, a linha de comando abaixo para reingressar.
EBarr

6

Eu acho que é razoavelmente comum para editores hexadecimais lidar com arquivos enormes. No Windows, eu uso HxD , que afirma lidar com arquivos de até 8 EB (8 bilhões de gigabytes).


14
Eu estaria interessado em saber como eles testaram isso ...: P
Shadow

No Linux, eu recomendohexedit
elegível

4

Estou usando o vim 7.3.3 no Win7 x64 com o plug-in LargeFile de Charles Campbell para lidar com arquivos de texto simples de vários gigabytes. Funciona muito bem.

Eu espero que você venha bem.


Como você pode desabilitar o plugin? Por exemplo, fazer com que todas as outras extensões, como o realce, funcionem novamente quando um arquivo é aberto no Vim?
hhh

3

Nossa, nunca consegui fazer o vim engasgar, mesmo com um ou dois GB. Ouvi dizer que UltraEdit (no Windows) e BBEdit (no Macs) são ainda mais adequados para arquivos ainda maiores, mas não tenho experiência pessoal.




2

Eu usei o editor / visualizador embutido do FAR Commander para arquivos de log muito grandes.



1

A única coisa que consegui usar para algo assim é meu editor hexadecimal favorito do Mac, 0XED. No entanto, isso foi com arquivos que considerei grandes, com dezenas de megabytes. Não tenho certeza de quão longe isso irá. Tenho quase certeza de que ele carrega apenas partes do arquivo na memória de uma vez.


0

No passado, usei com sucesso uma abordagem de divisão / edição / junção quando os arquivos ficam muito grandes. Para que isso funcione você deve saber onde está o texto a ser editado, no arquivo original.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.