Come modificare file di testo multi-gigabyte? Vim non funziona = ([closed]


112

Esistono editor in grado di modificare file di testo multi-gigabyte, magari caricando solo piccole porzioni in memoria contemporaneamente? Non sembra che Vim possa gestirlo = (


Ho caricato file di acquisizione dati davvero grandi in vim e li ha gestiti senza problemi.
Rook

A seconda delle tue esigenze di modifica, potresti essere in grado di collegarlo a qualcosa come sed o perl per eseguire una ricerca e sostituzione.
El Yobo

23
In realtà non è off-topic, molti programmatori usano vim, a volte come complemento all'editor dell'interfaccia utente. La domanda dell'argomento riguarda il problema reale. Conosciamo tutti solo due buoni strumenti dell'esercito svizzero per questo tipo di attività, quindi per favore non trattare vim come troppo esotico o fuori sede. COSÌ è per le persone.
Sławomir Lenart

Invece di chiuderlo, perché non spostarlo su SuperUser o Linux / Unix o VIM?
user1271772

Risposte:


72

Se siete su * nix (e supponendo che è necessario modificare solo alcune parti del file (e raramente)), è possibile dividere i file (utilizzando il splitcomando), modificare individualmente (utilizzando awk, sedo qualcosa di simile) e concatenare dopo aver sono fatti.

cat file2 file3 >> file1

10
Ottimo suggerimento. Avevo un file sql da 13 GB (152.000.000 di righe), e usando solo "split -l 1000000" per poi modificare i file da un milione di righe dove volevo con vim ha funzionato alla grande. Ci sono voluti 10 minuti solo per dividerli. (Ho provato ad aprire il file originale con vim e ha funzionato, ma era troppo lento per essere utilizzabile.)
Claes Mogren

149

Ctrl-C interromperà il caricamento del file. Se il file è abbastanza piccolo potresti essere stato fortunato ad aver caricato tutti i contenuti e ad aver terminato tutti i passaggi di post caricamento. Verificare che l'intero file sia stato caricato quando si utilizza questo suggerimento.

Vim può gestire abbastanza bene file di grandi dimensioni. Ho appena modificato un file da 3,4 GB, cancellando righe, ecc. Tre cose da tenere a mente:

  1. Premi Ctrl-C: Vim prova a leggere l'intero file inizialmente, a fare cose come l'evidenziazione della sintassi e il numero di righe nel file, ecc. Ctrl-C annullerà questa enumerazione (e l'evidenziazione della sintassi), e caricherà solo ciò che è necessario per essere visualizzato sullo schermo.
  2. Sola lettura: Vim inizierà probabilmente in sola lettura quando il file è troppo grande per poter creare un file. copia del file su cui eseguire le modifiche. Ho dovuto w! per salvare il file, ed è allora che ci è voluto più tempo.
  3. Vai alla riga: la digitazione :115355ti porterà direttamente alla riga 115355, che è molto più veloce in quei file di grandi dimensioni. Vim sembra iniziare la scansione dall'inizio ogni volta che carica un buffer di righe, e tenere premuto Ctrl-F per scansionare il file sembra diventare molto lento verso la fine.

Nota - Se la tua istanza Vim è in sola lettura perché premi Ctrl-C, è possibile che Vim non abbia caricato l'intero file nel buffer. In tal caso, salvarlo salverà solo ciò che è nel buffer, non l'intero file . Puoi controllare rapidamente con a Gper saltare alla fine per assicurarti che tutte le righe nel tuo file siano lì.


14
È stato in grado di gestire 44 gigabyte di dump xml di wikipedia in vim usando questo consiglio. (Ctrl-C).
vancan1ty

1
Ho provato a leggere la fine del file di registro da 2,5 GB su Windows. L'apertura in gvim ha provocato un errore di memoria insufficiente quando ha superato i 2 GB di memoria allocata. Quando si provava il trucco ctrl-c, smetteva di caricare il file in memoria ma consentiva solo di vedere la parte del file che gvim era in grado di caricare. Quindi più tempo ho aspettato prima di premere ctrl-c, più file ho potuto vedere. Navigare alla fine del file o caricare il resto del file era impossibile (o non sapevo come). Un po 'deludente che vim non fosse all'altezza del compito: (Alla fine ho usato uno strumento dedicato gratuito per dividere il file in file da
100

14
Non funziona per me. Carico un file da 3 GB, premo ctrl-c e poi viene visualizzato il contenuto. Posso modificare lo scroll ecc. Ma quando arrivo alla fine della parte caricata (diciamo il 5%) non verrà più caricata (sono bloccato con la parte del file caricata inizialmente fino al punto in cui ho premuto ctrl-c)
Patryk

1
Confermato, utente3338098. Se premi Ctrl-C e non carica l'intero file (come altri hanno parlato), salvandolo salva solo quello che hai caricato. Questo è probabilmente il motivo per cui in primo luogo va in sola lettura. Aggiornerò il mio punto di sola lettura per notare che.
Aaron R.

16
Seguire queste istruzioni mi ha fatto distruggere un file enorme che avevo appena scaricato. È necessario rimuovere completamente il punto 2 in quanto fornisce fondamentalmente istruzioni che causano la perdita di dati, di cui non si parla fino alla fine del post.
Neobyte

75

Potrebbero essere i plugin a provocarne il soffocamento. (evidenziazione della sintassi, pieghe ecc.)

Puoi eseguire vim senza plugin.

vim -u "NONE" hugefile.log

È minimalista ma almeno ti darà i movimenti vi a cui sei abituato.

syntax off

è un altro ovvio. Riduci l'installazione e procurati ciò di cui hai bisogno. Scoprirai di cosa è capace e se devi portare a termine un'attività con altri mezzi.


3
Questo carica ancora l'intero file nella RAM ...
Totor

@Totor sì, vorrei prima dividere il file, ma quell'impostazione ti darebbe rapidamente le migliori prestazioni di vim disattivando gli autocomandi casuali. Questo era il mio punto. Le workstation con una memoria decente dovrebbero essere in grado di gestire i file che si avvicinano a un concerto.
michael

2
quindi vim / vi è inutile quando il file è 10 volte la dimensione della memoria virtuale?
user3338098

1
Ho usato questo comando per aprire un file da 250 MB in meno di 2 secondi. Incredibile
user674669

20

Un leggero miglioramento rispetto alla risposta data da @Al pachio con la soluzione split + vim puoi leggere i file con un glob, utilizzando efficacemente blocchi di file come buffer ad es.

$ 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

15

Potresti voler controllare questo plugin VIM che disabilita alcune funzionalità di vim nell'interesse della velocità durante il caricamento di file di grandi dimensioni.


8

Ho provato a farlo, principalmente con file di circa 1 GB quando avevo bisogno di apportare alcune piccole modifiche a un dump SQL. Sono su Windows, il che lo rende un grosso problema. È seriamente difficile.

La domanda ovvia è "perché ne hai bisogno?" Posso dirti per esperienza che dovendo provare più di una volta, probabilmente vorrai davvero provare a trovare un altro modo.

Allora come si fa? Ci sono alcuni modi in cui l'ho fatto. A volte posso ottenere vim o nano per aprire il file e posso usarli. È un dolore davvero duro, ma funziona.

Quando non funziona (come nel tuo caso) hai solo poche opzioni. Puoi scrivere un programmino per apportare le modifiche necessarie (ad esempio, ricerca e sostituzione). Potresti usare un programma a riga di comando che potrebbe essere in grado di farlo (forse potrebbe essere realizzato con sed / awk / grep / ecc?)

Se quelli non funzionano, puoi sempre dividere il file in blocchi (qualcosa come la divisione è la scelta ovvia, ma potresti usare testa / coda per ottenere la parte che desideri) e quindi modificare le parti che ne hanno bisogno, e ricombinare più tardi.

Credimi però, prova a trovare un altro modo.


3
Di solito sed è tuo amico in casi come questo. Al tuo editor non piace il pensiero di inserire alcuni caratteri all'inizio di un file e capire come spingere tutto il resto verso il basso.
dkretz

@le dorfier: Sì. Ho usato sed quando dovevo fare una ricerca / sostituzione. Quando ho dovuto eliminare alcune righe da un file del genere (alcune righe follemente lunghe ) sono riuscito a farlo in vim, ma come puoi immaginare lo spostamento tra le righe (così come la cancellazione effettiva) ha richiesto un bel po 'di tempo (secondi + per rispondere e ridisegnare). Non vorrei tentare di aggiungere anche poche lettere a una di quelle righe.
MBCook

Esatto stesso problema .... un'istruzione "using" all'inizio di uno script SQL per una tabella di grandi dimensioni o un gruppo di file che non esiste nel sistema di destinazione. Uso Free File Splitter per romperli, la riga di comando qui sotto per ricongiungermi.
EBarr

6

Penso che sia ragionevolmente comune per gli editor esadecimali gestire file di grandi dimensioni. Su Windows, utilizzo HxD , che afferma di gestire file fino a 8 EB (8 miliardi di gigabyte).


14
Sarei interessato a sapere come l'hanno testato ...: P
Shadow

Su Linux mi raccomandohexedit
idoneo

4

Sto usando vim 7.3.3 su Win7 x64 con il plugin LargeFile di Charles Campbell per gestire file di testo normale multi-gigabyte. Funziona davvero bene.

Spero tu abbia ragione.


Come puoi disabilitare il plugin? Ad esempio, far funzionare di nuovo tutte le altre estensioni come l'evidenziazione quando un file è aperto in Vim?
hhh

3

Wow, non sono mai riuscito a far soffocare Vim, nemmeno con un GB o due. Ho sentito che UltraEdit (su Windows) e BBEdit (su Mac) sono ancora più adatti per file ancora più grandi, ma non ho esperienza personale.




2

Ho utilizzato l'editor / visualizzatore integrato di FAR Commander per file di registro di grandi dimensioni.


1

Ho usato TextPad per file di registro di grandi dimensioni, non ha un limite superiore.


1

L'unica cosa che sono stato in grado di usare per qualcosa del genere è il mio editor esadecimale per Mac preferito, 0XED. Tuttavia, era con file che consideravo grandi a decine di megabyte. Non sono sicuro di quanto lontano andrà. Sono abbastanza sicuro che carica solo parti del file in memoria contemporaneamente, però.


0

In passato ho utilizzato con successo un approccio di divisione / modifica / unione quando i file diventano molto grandi. Perché funzioni devi sapere dove si trova il testo da modificare, nel file originale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.