¿Cómo editar archivos de texto de varios gigabytes? Vim no funciona = ([cerrado]

112

¿Hay editores que puedan editar archivos de texto de varios gigabytes, quizás cargando solo pequeñas porciones en la memoria a la vez? No parece que Vim pueda manejarlo = (

Philip Brocoum
fuente
Cargué archivos de adquisición de datos realmente grandes en vim y los manejó sin problemas.
Torre
Dependiendo de sus necesidades de edición, es posible que pueda canalizarlo a través de algo como sed o perl para realizar una búsqueda y reemplazo.
El Yobo
23
En realidad, no está fuera de tema, muchos programadores usan vim, a veces como complemento del editor de UI. La pregunta del tema trata sobre un problema real. Todos conocemos solo dos buenas herramientas del ejército suizo para este tipo de tarea, así que por favor no trate a vim como demasiado exótico o fuera del sitio. SO es para la gente.
Sławomir Lenart
En lugar de cerrarlo, ¿por qué no moverlo a SuperUser o Linux / Unix o VIM?
user1271772

Respuestas:

72

Si se encuentra en * nix (y suponiendo que tiene que modificar sólo partes de archivo (y rara vez)), es posible dividir los archivos (utilizando el splitcomando), editar de forma individual (usando awk, sedo algo similar) y concatenar ellos después de que están hechos.

cat file2 file3 >> file1
Al Pacino
fuente
10
Buen consejo. Tenía un archivo sql de 13GB (152.000.000 líneas), y simplemente usar "split -l 1000000" y luego editar los archivos de un millón de líneas donde quería con vim funcionó muy bien. Tomó 10 minutos solo para dividirlos. (Traté de abrir el archivo original con vim y funcionó, pero era demasiado lento para ser utilizable)
Claes Mogren
149

Ctrl-C detendrá la carga del archivo. Si el archivo es lo suficientemente pequeño, es posible que haya tenido la suerte de haber cargado todo el contenido y haber eliminado los pasos posteriores a la carga. Verifique que se haya cargado todo el archivo cuando utilice este consejo.

Vim puede manejar archivos grandes bastante bien. Acabo de editar un archivo de 3.4GB, eliminar líneas, etc. Tres cosas a tener en cuenta:

  1. Presione Ctrl-C: Vim intenta leer en todo el archivo inicialmente, para hacer cosas como resaltado de sintaxis y número de líneas en el archivo, etc. Ctrl-C cancelará esta enumeración (y el resaltado de sintaxis), y solo cargará lo que necesario para mostrar en su pantalla.
  2. Solo lectura: Vim probablemente comenzará como de solo lectura cuando el archivo sea demasiado grande para crear un. copia de archivo para realizar las ediciones. Tuve que w! para guardar el archivo, y fue entonces cuando tomó más tiempo.
  3. Ir a la línea: escribir :115355lo llevará directamente a la línea 115355, que es mucho más rápido para esos archivos grandes. Vim parece comenzar a escanear desde el principio cada vez que carga un búfer de líneas, y mantener presionada la tecla Ctrl-F para escanear el archivo parece volverse muy lento cerca del final.

Nota: si su instancia de Vim es de solo lectura porque presionó Ctrl-C, es posible que Vim no haya cargado todo el archivo en el búfer. Si eso sucede, guardarlo solo guardará lo que está en el búfer, no el archivo completo . Puede consultar rápidamente con a Gpara saltar hasta el final para asegurarse de que todas las líneas de su archivo estén allí.

Aaron R.
fuente
14
Pude lidiar con 44 gigabytes de volcado de xml de wikipedia en vim usando este consejo. (Ctrl-C).
vancan1ty
1
Intenté leer el final del archivo de registro de 2.5GB en Windows. La apertura en gvim resultó en un error de memoria insuficiente cuando excedió los 2GB de memoria asignados. Al intentar el truco ctrl-c, dejó de cargar el archivo en la memoria, pero solo permitió ver la parte del archivo que gvim pudo cargar. Entonces, cuanto más esperaba antes de presionar ctrl-c, más archivo podía ver. Navegar hasta el final del archivo o cargar el resto del archivo era imposible (o no sabía cómo). Un poco decepcionante que vim no estaba preparado para la tarea:. (Al final he utilizado alguna herramienta dedicada libres para dividir el archivo en archivos de 100 MB
slawek
14
No funciona para mi. Cargo un archivo de 3GB, presiono ctrl-c y luego aparece el contenido. Puedo editar el desplazamiento, etc., pero cuando llego al final de la parte cargada (digamos 5%) ya no se carga (estoy atascado con la parte del archivo que se cargó inicialmente hasta el punto en que presioné ctrl-c)
Patryk
1
Confirmado, usuario3338098. Si presiona Ctrl-C y no carga todo el archivo (como han dicho otros), guardarlo solo guarda lo que ha cargado. Probablemente por eso entra en solo lectura en primer lugar. Actualizaré mi punto de solo lectura para tener en cuenta eso.
Aaron R.
16
Seguir estas instrucciones provocó que destruyera un archivo enorme que acababa de descargar. Debe eliminar por completo el punto 2, ya que básicamente brinda instrucciones que causan pérdida de datos, que no menciona hasta el final de la publicación.
Neobyte
75

Pueden ser los complementos los que hacen que se bloquee. (resaltado de sintaxis, pliegues, etc.)

Puede ejecutar vim sin complementos.

vim -u "NONE" hugefile.log

Es minimalista, pero al menos te dará los movimientos vi a los que estás acostumbrado.

syntax off

es otro obvio. Reduzca su instalación y obtenga lo que necesita. Descubrirás de lo que es capaz y si necesitas realizar una tarea por otros medios.

Miguel
fuente
3
Esto todavía carga todo el archivo en la RAM ...
Totor
@Totor, sí, dividiría el archivo primero, pero esa configuración te daría rápidamente el mejor rendimiento de vim al desactivar los comandos automáticos aleatorios. Ese era mi punto. Las estaciones de trabajo con memoria decente deberían poder manejar archivos que se acercan a un concierto.
Michael
2
entonces vim / vi es inútil cuando el archivo es 10 veces el tamaño de la memoria virtual?
user3338098
1
Utilicé este comando para abrir un archivo de 250 MB en menos de 2 segundos. Amazing
user674669
20

Una ligera mejora en la respuesta dada por @Al pachio con la solución split + vim en la que puede leer los archivos con un glob, usando efectivamente fragmentos de archivos como búfer, por ejemplo

$ 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
Amos Folarin
fuente
15

Es posible que desee consultar este complemento VIM que deshabilita ciertas funciones de vim en aras de la velocidad al cargar archivos grandes.

RojoAzulCosa
fuente
8

Intenté hacer eso, principalmente con archivos de alrededor de 1 GB cuando necesitaba hacer un pequeño cambio en un volcado SQL. Estoy en Windows, lo que lo convierte en un gran problema. Es muy difícil.

La pregunta obvia es "¿por qué es necesario?" Puedo decirte por experiencia teniendo que probar esto más de una vez, probablemente realmente quieras intentar encontrar otra manera.

Entonces, ¿cómo lo haces? Hay algunas formas en que lo he hecho. A veces puedo hacer que vim o nano abra el archivo y puedo usarlos. Es un dolor muy fuerte, pero funciona.

Cuando eso no funciona (como en su caso), solo tiene algunas opciones. Puede escribir un pequeño programa para realizar los cambios que necesita (por ejemplo, buscar y reemplazar). Podría usar un programa de línea de comandos que pueda hacerlo (¿tal vez podría lograrse con sed / awk / grep / etc?)

Si eso no funciona, siempre puede dividir el archivo en trozos (algo como dividir es la opción obvia, pero puede usar head / tail para obtener la parte que desea) y luego editar la (s) parte (s) que la necesitan, y recombinar más tarde.

Créame, trate de encontrar otra forma.

MBCook
fuente
3
Por lo general, sed es tu amigo en casos como este. A su editor realmente no le gusta la idea de insertar algunos caracteres en la parte superior de un archivo y averiguar cómo eliminar todo lo demás.
dkretz
@le dorfier: Sí. Usé sed cuando tuve que hacer una búsqueda / reemplazo. Cuando tuve que eliminar algunas líneas de un archivo como ese (algunas líneas increíblemente largas ), logré hacerlo en vim, pero como puede adivinar, moverse entre líneas (así como la eliminación real) tomó bastante tiempo. (segundos + para responder y volver a dibujar). No quisiera intentar agregar ni siquiera unas pocas letras a una de esas líneas.
MBCook
Exactamente el mismo problema ... una instrucción "using" en la parte superior de un script SQL para una tabla grande, o un grupo de archivos que no existe en el sistema de destino. Utilizo Free File Splitter para romperlos, la línea de comando a continuación para volver a unirlos.
EBarr
6

Creo que es bastante común que los editores hexadecimales manejen archivos enormes. En Windows, uso HxD , que afirma manejar archivos de hasta 8 EB (8 mil millones de gigabytes).

John Y
fuente
14
Me interesaría saber cómo probaron eso ...: P
Shadow
En linux lo recomiendohexedit
eligió
4

Estoy usando vim 7.3.3 en Win7 x64 con el complemento LargeFile de Charles Campbell para manejar archivos de texto sin formato de varios gigabytes. Funciona muy bien.

Espero que vengas bien.

AndrewJacksonZA
fuente
¿Cómo se puede desactivar el complemento? Por ejemplo, ¿hacer que todas las demás extensiones, como el resaltado, vuelvan a funcionar cuando se abre un archivo en Vim?
hhh
3

Vaya, nunca logré que vim se ahogara, ni siquiera con un GB o dos. Escuché que UltraEdit (en Windows) y BBEdit (en Mac) son aún más adecuados para archivos aún más grandes, pero no tengo experiencia personal.

Alex Martelli
fuente
2

He utilizado el editor / visor integrado de FAR Commander para archivos de registro de gran tamaño.

azheglov
fuente
1

He usado TextPad para archivos de registro grandes, no tiene un límite superior.

bstoney
fuente
1

Lo único que he podido usar para algo así es mi editor hexadecimal favorito de Mac, 0XED. Sin embargo, eso fue con archivos que consideré grandes en decenas de megabytes. No estoy seguro de hasta dónde llegará. Sin embargo, estoy bastante seguro de que solo carga partes del archivo en la memoria a la vez.

AriX
fuente
0

En el pasado, he utilizado con éxito un enfoque de división / edición / unión cuando los archivos crecen mucho. Para que esto funcione, debe saber dónde está el texto a editar, en el archivo original.

Cheeso
fuente