Intenté abrir un archivo enorme (~ 2GB) en VIM pero se ahogó. En realidad, no necesito editar el archivo, simplemente saltar de manera eficiente.
¿Cómo puedo trabajar con archivos muy grandes en VIM?
:set binary
primero ...
Intenté abrir un archivo enorme (~ 2GB) en VIM pero se ahogó. En realidad, no necesito editar el archivo, simplemente saltar de manera eficiente.
¿Cómo puedo trabajar con archivos muy grandes en VIM?
:set binary
primero ...
Respuestas:
Tenía un archivo de 12 GB para editar hoy. El complemento vim LargeFile no funcionó para mí. Todavía usó toda mi memoria y luego imprimió un mensaje de error :-(. No pude usar hexedit para ninguno de los dos, ya que no puede insertar nada, solo sobrescribir. Aquí hay un enfoque alternativo:
Divide el archivo, edita las partes y luego lo recombina. Sin embargo, todavía necesita el doble de espacio en disco.
Grep para algo alrededor de la línea que le gustaría editar:
grep -n 'something' HUGEFILE | head -n 1
Extraiga ese rango del archivo. Digamos que las líneas que desea editar están en la línea 4 y 5. Luego haga lo siguiente:
sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART
-n
requiere la opción para suprimir el comportamiento predeterminado de sed para imprimir todo4,5p
imprime las líneas 4 y 55q
aborta sed después de la línea de procesamiento 5 Edite SMALLPART
con su editor favorito.
Combinar el archivo:
(head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new
HUGEFILE.new
ahora será su archivo editado, puede eliminar el original HUGEFILE
.
Ésta ha sido una pregunta recurrente durante muchos años. (Los números siguen cambiando, pero el concepto es el mismo: ¿cómo veo o edito archivos que son más grandes que la memoria?)
Obviamente, more
o less
son buenos enfoques para simplemente leer los archivos, less
incluso ofrecen vi
combinaciones de teclas para desplazarse y buscar.
Una búsqueda de Freshmeat en "archivos grandes" sugiere que dos editores se adaptarían particularmente a sus necesidades.
Uno sería: lfhex ... un editor hexadecimal de archivos grandes (que depende de Qt). Ese, obviamente, implica el uso de una GUI.
Otro parecería ser adecuado para el uso de la consola: hed ... y afirma tener una vim
interfaz similar (¿incluye un ex
modo?).
Estoy seguro de que he visto otros editores para Linux / UNIX que pudieron desplazarse por los archivos sin cargarlos por completo en la memoria. Sin embargo, no recuerdo ninguno de sus nombres. Estoy haciendo de esta respuesta una entrada "wiki" para animar a otros a agregar sus enlaces a dichos editores. (Sí, estoy familiarizado con las formas de solucionar el problema usando split
y cat
; pero estoy pensando en editores, especialmente editores de consola / curses que pueden prescindir de eso y ahorrarnos el tiempo / latencias y la sobrecarga de espacio en disco que conllevan tales enfoques) .
Dado que no necesita editar el archivo:
view
(solo probado y cronometrado). Por supuesto, eso no es exactamente instantáneo, pero funciona.
Escribí un pequeño guión basado en la respuesta de Florian que usa nano (mi editor favorito):
#!/bin/sh
if [ "$#" -ne 3 ]; then
echo "Usage: $0 hugeFilePath startLine endLine" >&2
exit 1
fi
sed -n -e $2','$3'p' -e $3'q' $1 > hfnano_temporary_file
nano hfnano_temporary_file
(head -n `expr $2 - 1` $1; cat hfnano_temporary_file; sed -e '1,'$3'd' $1) > hfnano_temporary_file2
cat hfnano_temporary_file2 > $1
rm hfnano_temporary_file hfnano_temporary_file2
Úselo así:
sh hfnano yourHugeFile 3 8
En ese ejemplo, nano abrirá las líneas 3 a 8, puede editarlas, y cuando guarde y salga, esas líneas en el enorme archivo se sobrescribirán automáticamente con sus líneas guardadas.
Tuve el mismo problema, pero era un volcado de mysql de 300 GB y quería deshacerme de DROP
y cambiar CREATE TABLE
a, CREATE TABLE IF NOT EXISTS
por lo que no quería ejecutar dos invocaciones de sed
. Escribí este rápido script de Ruby para engañar al archivo con esos cambios:
#!/usr/bin/env ruby
matchers={
%q/^CREATE TABLE `foo`/ => %q/CREATE TABLE IF NOT EXISTS `foo`/,
%q/^DROP TABLE IF EXISTS `foo`;.*$/ => "-- DROP TABLE IF EXISTS `foo`;"
}
matchers.each_pair { |m,r|
STDERR.puts "%s: %s" % [ m, r ]
}
STDIN.each { |line|
#STDERR.puts "line=#{line}"
line.chomp!
unless matchers.length == 0
matchers.each_pair { |m,r|
re=/#{m}/
next if line[re].nil?
line.sub!(re,r)
STDERR.puts "Matched: #{m} -> #{r}"
matchers.delete(m)
break
}
end
puts line
}
Invocado como
./mreplace.rb < foo.sql > foo_two.sql
chmod +x mreplace.rb
primero, también podría simplementeruby mreplace.rb ..
Para grandes frases de una sola línea (imprime caracteres de 1
a 99
):
cut -c 1-99 filename
Ya es tarde, pero si solo desea navegar por el archivo sin editarlo, también cat
puede hacer el trabajo.
% cat filename | less
o alternativamente simple:
% less filename
cat
ting el archivo primero es increíblemente estúpido, ya que significa que el archivo estaría completamente en la memoria (por lo que less
puede buscar el archivo) o no se puede buscar en absoluto; cat
solo da un flujo de salida estático.
Hilo antiguo. Pero sin embargo (juego de palabras :)).
$less filename
less funciona de manera eficiente si no desea editar y simplemente mirar a su alrededor, que es el caso de examinar archivos de registro enormes.
Buscar en menos obras como vi
La mejor parte es que está disponible de forma predeterminada en la mayoría de las distribuciones. Así que tampoco será un problema para el entorno de producción.
esto es antiguo, pero usa nano, vim o gvim