¿Por qué Vim no puede abrir un archivo de texto de 100 MB cuando tengo 16 GB de RAM?

67

Tengo un archivo de respaldo de base de datos MySQL de 100MB y tengo problemas para abrirlo en Vim en mi caja Linux que tiene 16G de RAM.

Vim simplemente se cuelga (al menos inutilizable). Esto es algo que no entiendo. Tengo 16 GB de RAM, ¿por qué no puedo cargar un archivo de 100 MB en un editor?

¿Es por Vim? Pensé que toda la gestión de la memoria es manejada por el sistema operativo.

Pregunta y aprende
fuente
3
Considere usar un editor HEX en lugar de un editor de texto para ver dichos archivos. Sería un ejemplo de editor hexadecimal con interfaz similar a vi hexer.
Ruslan
13
No olvide que la memoria RAM no ha sido lo que se nos acaba cuando nos quedamos sin memoria durante décadas. La memoria ahora está virtualizada; se divide en páginas y esas páginas se pueden intercambiar en el disco. La cantidad de memoria asignada fuera del espacio de direcciones de un proceso y la cantidad de RAM consumida tienen muy poco que ver entre sí. Cuando te quedas sin memoria, te quedas sin espacio de direcciones , no RAM . La mejor manera de pensarlo es en la memoria es el espacio en disco , cada proceso obtiene una cierta cantidad fija de ese espacio, y la RAM es el hardware que hace que su disco sea más rápido .
Eric Lippert
21
@EricLippert Excepto que los discos tradicionales son tan lentos (en comparación con la RAM) que solo son adecuados para almacenar las páginas de memoria virtual que no están en uso activo. Si un proceso se cuelga (o es al menos inutilizable, como lo expresó el OP) debido a la transferencia de intercambio, es precisamente porque la RAM es de lo que se ha quedado sin.
depquid
66
@EricLippert quedarse sin espacio de direcciones solo es relevante en los sistemas de 32 bits en la actualidad. Dudo que el usuario con 16G de RAM todavía use el kernel PAE de 32 bits en lugar de uno normal de 64 bits.
Ruslan
3
@depquid: Ese es un buen punto; La idea central de mi comentario es que el OP parece creer que "cargué 100 MB de material, tengo 16000 MB de RAM, por lo que se consumieron 100 MB de mis 16000 MB de RAM". Este sistema de creencias está desactualizado.
Eric Lippert

Respuestas:

69

Vim a veces tiene problemas con los archivos que tienen líneas inusualmente largas. Es un editor de texto, por lo que está diseñado para archivos de texto, con longitudes de línea que generalmente tienen un máximo de cientos de caracteres de ancho.

Un archivo de base de datos puede no contener muchos caracteres de nueva línea, por lo que posiblemente podría ser una sola línea larga de 100 Mb. Vim no estará contento con eso, y aunque probablemente funcionará, puede llevar bastante tiempo cargar el archivo.

Ciertamente he abierto archivos de texto mucho más grandes que 100 Mb con Vim. El archivo ni siquiera necesita caber en la memoria de una vez (ya que Vim puede intercambiar cambios en el disco según sea necesario).

Greg Hewgill
fuente
1
También noté que las líneas muy largas, probadas con otro archivo sin líneas muy largas, ven una gran mejora. Gracias
Pregunte y aprenda el
11
@AskandLearn Dependiendo del tipo de archivo, puede ver un aumento en el rendimiento si usted set synmaxcol=120(o algún otro número apropiado). He notado grandes aceleraciones de esto en el pasado.
sapi
¿Alguien sabe si la reciente horquilla neovim manejará mejor las líneas más largas? Supongo que no es un problema particularmente común ...
Hemmer
@GregHewgill es cierto, también lo he observado, pero ¿cómo lo sabías?
Rahul Patil
56

En mi experiencia, Vim no se ahoga en archivos grandes , sino en líneas largas . Use este comando para mysqldumpusar líneas más cortas a expensas de un archivo más grande :

$ mysqldump --complete-insert -u -p

Además, puede abrir Vim y pedirle que no analice su .vimrcarchivo ni cargue ningún complemento con este comando:

$ vim -u NONE output.sql

Cargar Vim de esta manera usará menos memoria y no requerirá que Vim analice el archivo completo como hacen muchos complementos.

dotancohen
fuente
15

"cargar VIM sin .vimrc y complementos (limpiar VIM), por ejemplo, para archivos ENORMES

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

Intente usar en lesslugar de vimsi desea ver un archivo grande directamente. Vim intenta hacer muchas cosas diferentes cuando se carga por primera vez: escaneando el archivo (potencialmente en múltiples pasadas) para tratar de determinar qué sintaxis usar, realizando resaltado de sintaxis y buscando modelinas en la parte superior e inferior del archivo. Luego, a medida que edita el archivo, vim guarda archivos de intercambio y mantiene árboles de deshacer (el historial de deshacer en vim se ramifica, no es lineal como en cualquier otro editor?), Y reevalúa constantemente el resaltado de sintaxis a medida que cambia el texto, etc.

Nada de eso es necesariamente una justificación de por qué debe ser tan inutilizable con archivos gigantes, pero es más una explicación de algunas de las razones por las que lo es.

Godlygeek
fuente
Vea mi respuesta para saber cómo evitar que VIM realice operaciones pesadas como el análisis de archivos.
dotancohen
Sí, el resaltado de sintaxis en cosas como XML y SQL puede ser muy lento en archivos más grandes.
Marcin
9

Vim no solo carga el archivo tal como está en la memoria. Lo convierte en estructuras internas (líneas, palabras, etc.), resalta la sintaxis utilizando un lenguaje de script interno, etc. todo lo cual consume memoria (mucho más que un byte para un personaje) y tiempo de CPU.

demonkoryu
fuente
El consumo de memoria ni siquiera es el problema. El tiempo de CPU que se está ocupando (y una congelación visible mientras espera), es.
Lightness compite con Monica el
Ese tiempo de CPU lo ocupa principalmente el script de resaltado de sintaxis.
demonkoryu 01 de
Sí estoy de acuerdo. Solo digo que es poco probable que el uso de la memoria (a) sea un problema o (b) cause un retraso prolongado, contrario a lo que dice su respuesta.
Lightness compite con Monica el
Tienes razón, he actualizado mi respuesta en consecuencia.
demonkoryu
7

Puede intentar cargarlo como binario. He tenido suerte con eso para archivos realmente grandes, sin texto

vim -b HUGEFILE

También es posible que IIRC use vim como editor hexadecimal, consulte: http://usevim.com/2012/06/20/vim-binary-files/

Steve Butler
fuente
4

Esperemos que su problema tenga más que ver con la necesidad de VIM de archivos temporales (como el intercambio) más que RAM.

En muchos casos, los archivos temporales creados por VIM están en el mismo directorio del archivo que está abriendo. Si este es su caso, puede verificarlo verificando el espacio disponible en disco en el directorio actual.

Afortunadamente, hay buena documentación sobre cómo puede especificar una ubicación diferente para los archivos de indexación / intercambio de VIM:

También puede deshabilitar el archivo de intercambio

samt
fuente
1

Ocasionalmente abro grandes copias de seguridad de bases de datos en formato de texto .sql. Los archivos muy grandes o los archivos con líneas muy largas a menudo parecen tardar mucho tiempo en abrirse en vim. Esto podría estar relacionado con el procesamiento de sintaxis y el resaltado de color, como se menciona en las respuestas de @zzapper y @demonkoryu.

Una solución rápida podría ser presionar "control-G" durante la carga del archivo para cancelar el procesamiento previo de resaltado de sintaxis.

digitalsean
fuente