Por que o Vim não pode abrir um arquivo de texto de 100 MB quando tenho 16 GB de RAM?

67

Eu tenho um arquivo de backup de banco de dados MySQL de 100 MB e tenho problemas para abri-lo no Vim na minha caixa Linux com 16G de RAM.

O Vim simplesmente trava (pelo menos inutilizável). Isso é algo que eu não entendo. Tenho 16 GB de RAM, por que não consigo carregar um arquivo de 100 MB em um editor?

É por causa do Vim? Eu pensei que todo o gerenciamento de memória é tratado pelo sistema operacional.

Peça e aprenda
fonte
3
Considere usar um editor HEX em vez de um editor de texto para visualizar esses arquivos. Um exemplo de editor hexadecimal com interface semelhante ao vi seria hexer.
Ruslan
13
Não se esqueça que a RAM não é o que acabamos quando ficamos sem memória há décadas. A memória agora está virtualizada; é dividido em páginas e essas páginas podem ser trocadas para o disco. A quantidade de memória alocada no espaço de endereço de um processo e a quantidade de RAM consumida têm muito pouco a ver uma com a outra. Quando você fica sem memória, fica sem espaço de endereço , não RAM . A melhor maneira de pensar é na memória , espaço em disco , cada processo obtém uma certa quantidade fixa desse espaço e a RAM é um hardware que torna seu disco mais rápido .
precisa
21
@EricLippert Exceto que os discos tradicionais são tão lentos (em comparação com a RAM) que são adequados apenas para armazenar as páginas de memória virtual que não estão em uso ativo. Se um processo trava (ou é pelo menos inutilizável, como o OP diz) devido à troca de trocas, é precisamente porque a RAM é o que acabou.
depquid
6
O @EricLippert ficar sem espaço de endereço é relevante apenas em sistemas de 32 bits atualmente. Duvido que o usuário com 16G de RAM ainda use o kernel PAE de 32 bits em vez do normal de 64 bits.
Ruslan
3
@ dépid: Esse é um bom ponto; o ponto forte do meu comentário é que o OP parece ter a crença de que "eu carreguei 100 MB de material, tenho 16000 MB de RAM; portanto, 100 MB dos meus 16000 MB de RAM foram consumidos". Esse sistema de crenças está desatualizado.
precisa

Respostas:

69

Às vezes, o Vim tem problemas com arquivos com linhas longas incomumente. É um editor de texto, desenvolvido para arquivos de texto, com comprimentos de linha que geralmente têm no máximo algumas centenas de caracteres.

Um arquivo de banco de dados pode não conter muitos caracteres de nova linha; portanto, é possível que seja uma única linha longa de 100 Mb. O Vim não ficará satisfeito com isso e, embora provavelmente funcione, pode levar muito tempo para carregar o arquivo.

Certamente abri arquivos de texto muito maiores que 100 Mb com o Vim. O arquivo nem precisa caber na memória de uma só vez (já que o Vim pode trocar as alterações no disco, conforme necessário).

Greg Hewgill
fonte
11
Notei também que as linhas muito longas, tentadas com outro arquivo sem linhas muito longas, veem uma grande melhoria. Obrigado
Ask and Learn
11
@AskandLearn Dependendo do tipo de arquivo, você poderá ver um aumento no desempenho se você set synmaxcol=120(ou algum outro número apropriado). Eu notei enormes acelerações disso no passado.
sapi 26/06
Alguém sabe se o garfo neovim recente vai lidar melhor com linhas mais longas? Eu acho que não é uma questão particularmente comum ...
Hemmer
@GregHewgill é verdade, eu também observei isso, mas como você sabia disso?
Rahul Patil
56

Na minha experiência, o Vim engasga não com arquivos grandes , mas com longas filas . Use este comando para mysqldumpusar linhas mais curtas à custa de um arquivo maior :

$ mysqldump --complete-insert -u -p

Além disso, você pode abrir o Vim e solicitar que ele não analise seu .vimrcarquivo ou carregue plugins com este comando:

$ vim -u NONE output.sql

Carregar o Vim dessa maneira consumirá menos memória e não exigirá que o Vim analise o arquivo inteiro como muitos plugins.

dotancohen
fonte
15

"carrega o VIM sem .vimrc e plugins (VIM limpo), por exemplo, para arquivos ENORMES

  gvim -u NONE -U NONE -N largefile.sql
zzapper
fonte
13

Tente usar em lessvez de vimse você deseja visualizar um arquivo grande diretamente. O Vim tenta fazer muitas coisas diferentes quando é carregado pela primeira vez - varrendo o arquivo (potencialmente em várias passagens) para tentar determinar qual sintaxe usar, realçando a sintaxe e procurando modelines na parte superior e inferior do arquivo. Então, enquanto você edita o arquivo, o vim salva os arquivos de troca e mantém as árvores de desfazer (o histórico de desfazer no vim é ramificado, não linear como em todo (?) Outro editor) e reavalia constantemente a realce da sintaxe conforme o texto muda, etc.

Nada disso é necessariamente uma justificativa para o porquê de ser tão inutilizável com arquivos gigantes, mas é mais uma explicação de algumas das razões pelas quais é.

godlygeek
fonte
Veja minha resposta para saber como impedir o VIM de executar operações pesadas, como análise de arquivos.
dotancohen
Sim, o realce de sintaxe em coisas como XML e SQL pode ficar muito lento em arquivos maiores.
26614 Marcin
9

O Vim não carrega apenas o arquivo como está na memória. Ele o converte em estruturas internas (linhas, palavras, etc.), executa o realce da sintaxe usando uma linguagem de script interna e assim por diante; tudo isso consome memória (muito mais que um byte para um personagem) e tempo de CPU.

demonkoryu
fonte
Consumir memória nem é o problema. O tempo de CPU que está sendo consumido (e um congelamento visível enquanto você espera) é.
Lightness Races com Monica
Esse tempo de CPU é usado principalmente pelo script de destaque da sintaxe.
Demonkoryu
Sim eu concordo. Estou apenas dizendo que é improvável que o uso da memória (a) seja um problema ou (b) cause um longo atraso, ao contrário do que sua resposta diz.
Lightness Races com Monica
Você está certo, eu atualizei minha resposta de acordo.
Demonkoryu
7

Você pode tentar carregá-lo como um binário. Eu tive sorte com isso em arquivos realmente grandes, sem texto

vim -b HUGEFILE

Também é possível que o IIRC use o vim como um editor hexadecimal, consulte: http://usevim.com/2012/06/20/vim-binary-files/

Steve Butler
fonte
4

Esperamos que seu problema esteja mais relacionado aos VIMs que precisam de arquivos temporários (como swap) mais que RAM.

Em muitos casos, os arquivos temporários criados pelo VIM estão no mesmo diretório do arquivo que você está abrindo. Se esse for o seu caso, você poderá verificar verificando o espaço em disco disponível no diretório atual.

Felizmente, há uma boa documentação sobre como você pode especificar um local diferente para os arquivos de indexação / troca do VIM:

Você também pode desativar o arquivo de troca

samt
fonte
1

Ocasionalmente, abro backups grandes de bancos de dados no formato de texto .sql. Arquivos muito grandes, ou arquivos com linhas muito longas, às vezes parecem levar muito tempo para serem abertos no vim. Isso pode estar relacionado ao processamento de sintaxe e ao destaque de cores, conforme mencionado nas respostas de @zzapper e @demonkoryu.

Uma solução rápida pode ser pressionar "control-G" durante o carregamento do arquivo para cancelar a sintaxe, destacando o pré-processamento.

digitalsean
fonte