2009-10-19 14 views
99

Ho tentato di aprire un file enorme (~ 2 GB) in VIM ma si è bloccato. In realtà non ho bisogno di modificare il file, basta saltare in giro in modo efficiente.Utilizzo di file enormi in VIM

Come posso lavorare con file di grandi dimensioni in VIM?

+4

Vim dovrebbe essere a posto fino a quando si ': impostare binary' prima ... – ephemient

+1

Questo è un buon bersaglio per una nuova fuse il filesystem! ** splitfs ** o qualcosa del genere ... ci sto lavorando! – rodrigo

+1

Troppo tardi ... questo esiste già: http://sourceforge.net/projects/joinsplitfs/ – rodrigo

risposta

1

emacs funziona molto bene con i file nei 100 di megabyte, l'ho usato su file di log senza troppi problemi.

Ma generalmente quando ho qualche tipo di compito di analisi, trovo che scrivere uno script perl sia una scelta migliore.

18

Dal momento che non c'è bisogno di modificare effettivamente il file:

  1. view (o vim -R) dovrebbe funzionare abbastanza bene su file di grandi dimensioni.
  2. Oppure si può utilizzare more o less
+3

vim con "-R" continua a soffocare. Meno è una buona idea. – hoju

+0

Per "strozzature" intendi un po 'di tempo per aprire? O in realtà si blocca? Ci vuole un po 'più di 4 minuti sul mio non-così recente box Linux per aprire file da 2.7 GB in 'view' (solo provato e sincronizzato). Certo, non è esattamente istantaneo, ma funziona. – ChssPly76

+0

Sì, bancarelle. Sono sicuro che se avessi aspettato si sarebbe aperto alla fine. Sono andato con meno perché si apre immediatamente e sono abituato alla navigazione. – hoju

28

Questa è stata una domanda ricorrente per molti anni. (I numeri continuano a cambiare, ma il concetto è lo stesso: come faccio a visualizzare o modificare i file che sono più grandi di memoria)

Ovviamente more o less sono buoni approcci per la lettura solo i file --- less offre anche vi come i tasti per lo scorrimento e la ricerca.

A Freshmeat la ricerca su "file di grandi dimensioni" suggerisce che due editori sarebbero particolarmente adatti alle proprie esigenze.

Uno sarebbe: lfhex ... un editor di file esadecimale di grandi dimensioni (che dipende da Qt). Quello, ovviamente, comporta l'utilizzo di una GUI.

Un altro sembra essere adatto all'uso della console: hed ... e afferma di avere un'interfaccia simile a vim (compresa una modalità ex?).

Sono sicuro di aver visto altri editor per Linux/UNIX che erano in grado di sfogliare i file senza caricarli interamente nella memoria. Tuttavia, non ricordo nessuno dei loro nomi. Sto facendo questa risposta una voce "wiki" per incoraggiare gli altri ad aggiungere i loro link a tali editori. (Sì, ho familiarità con i modi per aggirare il problema utilizzando split e cat, ma sto pensando agli editor, in particolare gli editor di console/curses che possono fare a meno di questo e risparmiarci il tempo/le latenze e lo spazio sul disco che tali approcci comportare).

+1

meno lavorato ottimo –

74

Ho un file da 12 GB da modificare oggi. Il plugin vim LargeFile non ha funzionato per me. Ha ancora esaurito tutta la mia memoria e poi ha stampato un messaggio di errore :-(Non ho potuto usare hexedit per nessuno, dato che non può inserire nulla, basta sovrascrivere. Ecco un approccio alternativo:

Hai diviso il file, modifica . le parti e poi ricombinare Puoi ancora bisogno il doppio dello spazio su disco se

  • Grep per qualcosa che circonda la linea che si desidera modificare:.

    grep -n 'something' HUGEFILE | head -n 1 
    
  • estratto che gamma di file. Dì che le linee che vuoi modificare sono alla riga 4 an d 5.Poi fare:

    sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART 
    
    • L'opzione -n è necessario per sopprimere il comportamento predefinito di sed di stampare tutto
    • 4,5p Stampa le linee 4 e 5
    • 5q interrompe sed dopo linea di lavorazione 5
  • Modifica SMALLPART utilizzando il tuo editor preferito.

  • Combinare file:

    (head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new 
    
    • cioè: raccogliere tutte le linee prima le linee modificate dalla HUGEFILE (che in questo caso è la top 3 linee), si combinano con le linee modificati (in questo caso le righe 4 e 5) e utilizzare questo set combinato di righe per sostituire l'equivalente (in questo caso le prime 5 righe) nell'HUGEFILE e scrivere tutto in un nuovo file.

    HUGEFILE.new sarà il file modificato, è possibile eliminare l'originale HUGEFILE.

-14

questo è vecchio ma, uso nano, vim o gvim

+3

per default bobine vim – hoju

+4

Questi strumenti non fanno nulla per risolvere il problema. –

+1

nano riempie la memoria e muore su di me. –

2

E 'già tardi, ma se si desidera solo per navigare attraverso il file senza modificarlo, cat può fare il lavoro troppo.

% cat filename | less 

o in alternativa semplice:

% less filename 
+5

Si noti che 'cat'ting il file per primo è follemente stupido, in quanto significa che il file sarà completamente in memoria (quindi' less' può cercare il file) o non può essere cercato affatto; 'cat' fornisce solo un flusso di output statico. – Smar

2

Ho avuto lo stesso problema, ma era una discarica 300GB mysql e ho voluto sbarazzarsi del DROP e cambiare CREATE TABLE-CREATE TABLE IF NOT EXISTS quindi non ha voluto per eseguire due invocazioni di sed. Ho scritto questo breve script Ruby per ingannare il file con le modifiche:

#!/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 
} 

Invocato come

./mreplace.rb <foo.sql> foo_two.sql 
+0

Giusto per notare per l'esecuzione, per eseguirlo come un exe richiede 'chmod + x mreplace.rb' prima, si potrebbe anche solo' ruby ​​mreplace.rb ..' – Smar

+0

Grazie @Steeve McCauley! Bel lavoro. Esattamente quello che stavo cercando quando cercavo la risposta a questa domanda. –

6

ho scritto un piccolo script in base alla risposta di Florian che utilizza nano (il mio editor preferito):

#!/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 

usare in questo modo:

sh hfnano yourHugeFile 3 8 

In questo esempio, nano aprirà le righe da 3 a 8, puoi modificarli e quando salvi e chiudi, quelle linee nell'enorme file verranno sovrascritte automaticamente con le tue linee salvate.

-1

Vecchio thread. Ma comunque (gioco :)).

$less filename 

meno funziona in modo efficiente se non si desidera modificare e basta guardarsi intorno, che è il caso per l'esame i file di log enormi.

Cerca in meno opere come vi

parte migliore, è disponibile di default sulla maggior parte delle distribuzioni. Quindi non sarà un problema anche per l'ambiente di produzione.

+0

Cercare in un file di testo da 650 MB con meno dimostrato di essere un PITA. L'uso di vim con LargeFile funziona come un incantesimo. – MariusCC

+2

@MariusCC Quindi non hai lavorato con più di 2 GB di file, il tuo fascino svanirà con crash! – deepdive

1

Per enormi battute (stampa caratteri da 1 a 99):

cut -c 1-99 filename