Perché Vim non può aprire un file di testo da 100 MB quando ho 16 GB di RAM?


67

Ho un file di backup del database MySQL da 100 MB e ho difficoltà ad aprirlo in Vim sulla mia scatola Linux che ha 16G di RAM.

Vim si blocca (almeno inutilizzabile). Questo è qualcosa che non capisco. Ho 16 GB di RAM, perché non riesco a caricare un file da 100 MB in un editor?

È a causa di Vim? Pensavo che tutta la gestione della memoria fosse gestita dal sistema operativo.


3
Prendi in considerazione l'utilizzo di un editor HEX anziché di un editor di testo per visualizzare tali file. Un esempio di editor esadecimale con interfaccia simile a vi sarebbe hexer.
Ruslan,

13
Non dimenticare che la RAM non è stata ciò che abbiamo esaurito quando abbiamo esaurito la memoria per decenni. La memoria è ora virtualizzata; è diviso in pagine e quelle pagine possono essere scambiate su disco. La quantità di memoria allocata dallo spazio degli indirizzi di un processo e la quantità di RAM consumata hanno ben poco a che fare l'una con l'altra. Quando esaurisci la memoria, hai esaurito lo spazio degli indirizzi , non la RAM . Il modo migliore per pensarci è la memoria è lo spazio su disco , ogni processo ottiene una certa quantità fissa di quello spazio e la RAM è l'hardware che rende il tuo disco più veloce .
Eric Lippert,

21
@EricLippert Ad eccezione del fatto che i dischi tradizionali sono così lenti (rispetto alla RAM) che sono adatti solo per l'archiviazione delle pagine di memoria virtuale che non sono in uso attivo. Se un processo si blocca (o è almeno inutilizzabile, come dice l'OP) a causa del thrashing di scambio, è proprio perché la RAM è ciò che ha esaurito.
depquid

6
@EricLippert esaurire lo spazio degli indirizzi è rilevante solo sui sistemi a 32 bit oggi. Dubito che l'utente con RAM 16G utilizzerà comunque il kernel PAE a 32 bit anziché il normale 64 bit.
Ruslan,

3
@depquid: questo è un buon punto; il filo conduttore del mio commento è che l'OP sembra avere la convinzione che "ho caricato 100 MB di roba, ho 16000 MB di RAM, quindi sono stati consumati 100 MB dei miei 16000 MB di RAM". Questo sistema di credenze è obsoleto.
Eric Lippert,

Risposte:


69

Vim a volte ha problemi con i file che hanno linee insolitamente lunghe. È un editor di testo, quindi è progettato per file di testo, con lunghezze di riga che sono generalmente al massimo poche centinaia di caratteri.

Un file di database potrebbe non contenere molti caratteri di nuova riga, quindi potrebbe essere plausibilmente una singola riga lunga 100 Mb. Vim non ne sarà contento, e anche se probabilmente funzionerà, il caricamento del file potrebbe richiedere parecchio tempo.

Ho certamente aperto file di testo molto più grandi di 100 Mb con Vim. Non è nemmeno necessario che il file si adatti alla memoria tutto in una volta (poiché Vim può scambiare le modifiche sul disco secondo necessità).


1
Ho anche notato le righe molto lunghe, provato con un altro file senza righe molto lunghe, vedo un grande miglioramento. Grazie
Chiedi e impara il

11
@AskandLearn A seconda del tipo di file, potresti vedere un aumento delle prestazioni se tu set synmaxcol=120(o qualche altro numero appropriato). Ho notato enormi accelerazioni da questo in passato.
sapi,

Qualcuno sa se la recente forcella Neovim gestirà meglio le linee più lunghe? Immagino che non sia un problema particolarmente comune ...
Hemmer,

@GregHewgill è vero, l'ho osservato anche io, ma come lo sapevi?
Rahul Patil,

56

Nella mia esperienza, Vim non soffoca su file di grandi dimensioni , ma su lunghe file . Utilizzare questo comando per mysqldumputilizzare linee più brevi a scapito di un file più grande :

$ mysqldump --complete-insert -u -p

Inoltre, puoi aprire Vim e chiedergli di non analizzare il tuo .vimrcfile o caricare alcun plugin con questo comando:

$ vim -u NONE output.sql

Caricare Vim in questo modo utilizzerà meno memoria e non richiederà a Vim di analizzare l'intero file come fanno molti plugin.


15

"carica VIM senza .vimrc e plugin (clean VIM) ad es. per file ENORMI

  gvim -u NONE -U NONE -N largefile.sql

13

Prova a utilizzare lessinvece di vimse vuoi visualizzare direttamente un file di grandi dimensioni. Vim prova a fare molte cose diverse al primo caricamento: scansiona il file (potenzialmente in più passaggi) per cercare di determinare quale sintassi usare, eseguire l'evidenziazione della sintassi e cercare modeline nella parte superiore e inferiore del file. Quindi mentre modifichi il file, vim sta salvando i file di swap e mantenendo gli alberi di annullamento (annulla la cronologia in vim si ramifica, non lineare come in ogni (?) Altro editor) e rivaluta costantemente l'evidenziazione della sintassi quando il testo cambia, ecc.

Niente di tutto ciò è necessariamente una giustificazione del perché deve essere così inutilizzabile con file giganti, ma è più una spiegazione di alcuni dei motivi per cui lo è.


Vedi la mia risposta su come impedire a VIM di eseguire operazioni pesanti come l'analisi dei file.
dotancohen,

Sì, l'evidenziazione della sintassi su cose come XML e SQL può diventare molto lenta su file più grandi.
Marcin,

9

Vim non carica semplicemente il file così com'è in memoria. Lo converte in strutture interne (linee, parole, ecc.), Esegue l'evidenziazione della sintassi utilizzando un linguaggio di script interno e così via; tutto ciò consuma memoria (molto più di un byte per un carattere) e tempo della CPU.


Il consumo di memoria non è nemmeno il problema. Il tempo CPU impiegato (e un blocco visibile durante l'attesa) è.
Lightness Races con Monica il

Il tempo della CPU è occupato principalmente dallo script di evidenziazione della sintassi.
demonkoryu,

Si, sono d'accordo. Sto solo dicendo che è improbabile che l'uso della memoria (a) costituisca un problema o (b) causi un lungo ritardo, contrariamente a quanto dice la tua risposta.
Lightness Races con Monica,

Hai ragione, ho aggiornato la mia risposta di conseguenza.
demonkoryu,


4

Spero che il tuo problema abbia più a che fare con la necessità dei VIM di file temporanei (come lo scambio) più della RAM.

In molti casi, i file temporanei creati da VIM si trovano nella stessa directory del file che si sta aprendo. Se questo è il tuo caso, puoi verificarlo controllando lo spazio disponibile su disco nella directory corrente.

Fortunatamente, esiste una buona documentazione su come specificare un percorso diverso per i file di indicizzazione / scambio di VIM:

Puoi anche disabilitare il file di scambio


1

Di tanto in tanto apro backup di database di grandi dimensioni in formato testo .sql. File molto grandi o file con linee molto lunghe a volte sembrano impiegare molto tempo ad aprirsi in vim. Ciò potrebbe essere correlato all'elaborazione della sintassi e all'evidenziazione del colore, come indicato nelle risposte di @zzapper e @demonkoryu.

Una soluzione alternativa potrebbe essere quella di premere "control-G" durante il caricamento del file per annullare la pre-elaborazione dell'evidenziazione della sintassi.

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.