Warum kann Vim eine 100-MB-Textdatei nicht öffnen, wenn ich 16 GB RAM habe?

67

Ich habe eine 100-MB-MySQL-Datenbank-Sicherungsdatei und habe Probleme, sie in Vim auf meiner Linux-Box mit 16 GB RAM zu öffnen.

Vim hängt nur (zumindest unbrauchbar). Das verstehe ich nicht. Ich habe 16 GB RAM. Warum kann ich keine 100-MB-Datei in einen Editor laden?

Liegt es an Vim? Ich dachte, die gesamte Speicherverwaltung wird vom Betriebssystem übernommen.

Fragen und lernen
quelle
3
Verwenden Sie einen HEX-Editor anstelle eines Texteditors, um solche Dateien anzuzeigen. Ein Beispiel für einen Hex-Editor mit vi-ähnlicher Oberfläche wäre hexer.
Ruslan
13
Vergessen Sie nicht, dass der Arbeitsspeicher nicht das ist, wofür wir seit Jahrzehnten keinen Arbeitsspeicher mehr haben. Der Speicher ist jetzt virtualisiert. Es ist in Seiten unterteilt und diese Seiten können auf die Festplatte ausgetauscht werden. Die Menge an Speicher, die aus dem Adressraum eines Prozesses zugewiesen wird, und die Menge an verbrauchtem RAM haben sehr wenig miteinander zu tun. Wenn Ihnen der Arbeitsspeicher ausgeht, haben Sie keinen Adressraum mehr und keinen RAM . Der beste Weg, dies als Arbeitsspeicher zu bezeichnen , ist der Speicherplatz auf der Festplatte , jeder Prozess erhält eine bestimmte feste Menge dieses Speicherplatzes, und RAM ist die Hardware, die Ihre Festplatte schneller macht .
Eric Lippert
21
@EricLippert Abgesehen davon, dass herkömmliche Festplatten im Vergleich zum RAM so langsam sind, dass sie nur zum Speichern der virtuellen Speicherseiten geeignet sind, die nicht aktiv verwendet werden. Wenn ein Prozess aufgrund von Swap-Thrashing hängen bleibt (oder zumindest unbrauchbar ist, wie es das OP ausdrückte), liegt dies genau daran, dass der RAM-Speicher nicht mehr ausreicht.
Depquid
6
@EricLippert, dem der Adressraum ausgeht, ist heutzutage nur auf 32-Bit-Systemen relevant. Ich bezweifle, dass der Benutzer mit 16G RAM noch 32-Bit-PAE-Kernel anstelle des normalen 64-Bit-Kernels verwenden wird.
Ruslan
3
@depquid: Das ist ein guter Punkt; Der Kern meines Kommentars ist, dass das OP den Glauben zu haben scheint, dass "Ich habe 100 MB Material geladen, ich habe 16000 MB RAM, also wurden 100 MB von meinen 16000 MB RAM verbraucht". Dieses Glaubenssystem ist veraltet.
Eric Lippert

Antworten:

69

Vim hat manchmal Probleme mit Dateien, die ungewöhnlich lange Zeilen haben. Da es sich um einen Texteditor handelt, ist er für Textdateien mit Zeilenlängen von in der Regel höchstens einigen hundert Zeichen konzipiert.

Eine Datenbankdatei enthält möglicherweise nicht viele Zeilenumbrüche. Es ist daher denkbar, dass es sich um eine einzelne Zeile mit einer Länge von 100 MB handelt. Vim wird damit nicht zufrieden sein, und obwohl es wahrscheinlich funktionieren wird, kann es ziemlich lange dauern, bis die Datei geladen ist.

Ich habe mit Vim sicherlich Textdateien geöffnet , die viel größer als 100 MB sind. Die Datei muss nicht einmal auf einmal in den Arbeitsspeicher passen (da Vim Änderungen nach Bedarf auf die Festplatte übertragen kann).

Greg Hewgill
quelle
1
Ich bemerkte auch die sehr langen Zeilen, die mit einer anderen Datei ohne sehr lange Zeilen ausprobiert wurden und eine große Verbesserung zeigten. Thanks
Ask and Learn
11
@AskandLearn Abhängig vom Dateityp kann bei Ihnen set synmaxcol=120(oder einer anderen geeigneten Anzahl) eine Leistungssteigerung auftreten . Ich habe in der Vergangenheit große Geschwindigkeitssteigerungen festgestellt.
Sapi
Weiß jemand, ob die neue Neovim-Gabel längere Leinen besser beherrscht? Ich denke, es ist kein besonders häufiges Problem ...
Hemmer
@ GregHewgill es ist wahr, ich habe das auch beobachtet, aber woher wusstest du das?
Rahul Patil
56

Meiner Erfahrung nach verschluckt sich Vim nicht an großen Dateien , sondern an langen Warteschlangen . Verwenden Sie diesen Befehl, mysqldumpum kürzere Zeilen auf Kosten einer größeren Datei zu verwenden :

$ mysqldump --complete-insert -u -p

Zusätzlich können Sie Vim öffnen und es bitten, Ihre .vimrcDatei nicht zu analysieren oder Plugins mit diesem Befehl zu laden:

$ vim -u NONE output.sql

Wenn Sie Vim auf diese Weise laden, wird weniger Speicherplatz benötigt, und es ist nicht erforderlich, dass Vim die gesamte Datei analysiert, wie dies bei vielen Plugins der Fall ist.

dotancohen
quelle
15

msgstr "VIM ohne .vimrc und Plugins (sauberes VIM) laden, zB für GROSSE Dateien

  gvim -u NONE -U NONE -N largefile.sql
zzapper
quelle
13

Verwenden Sie lessstatt, vimwenn Sie eine große Datei direkt anzeigen möchten. Vim versucht beim ersten Laden, eine Menge verschiedener Aufgaben zu erledigen: Durchsuchen der Datei (möglicherweise in mehreren Durchläufen), um festzustellen, welche Syntax verwendet werden soll, und Syntaxhervorhebung durchzuführen und nach Modelines oben und unten in der Datei zu suchen. Während Sie die Datei bearbeiten, speichert vim Swap-Dateien und behält die Undo-Bäume bei (der Undo-Verlauf in vim verzweigt sich, nicht linear wie in jedem (?) Anderen Editor), und überprüft die Syntaxhervorhebung ständig, wenn sich der Text ändert usw.

Nichts davon ist notwendigerweise eine Rechtfertigung dafür, warum es mit riesigen Dateien so unbrauchbar sein muss, aber es ist eher eine Erklärung für einige der Gründe, warum es so ist.

godlygeek
quelle
In meiner Antwort erfahren Sie, wie Sie verhindern, dass VIM die umfangreichen Vorgänge wie das Parsen von Dateien ausführt.
Dotancohen
Ja, Syntax-Hervorhebungen in XML und SQL können bei größeren Dateien sehr langsam werden.
Marcin
9

Vim lädt die Datei nicht einfach so wie sie ist in den Speicher. Es konvertiert es in interne Strukturen (Zeilen, Wörter usw.), führt Syntaxhervorhebungen mithilfe einer internen Skriptsprache durch und so weiter. All dies verbraucht Speicher (viel mehr als ein Byte für ein Zeichen) und CPU-Zeit.

demonkoryu
quelle
Das Verbrauchen von Speicher ist nicht einmal das Problem. Die ausgelastete CPU-Zeit (und ein sichtbares Einfrieren, während Sie warten) ist.
Leichtigkeitsrennen im Orbit
Diese CPU-Zeit wird hauptsächlich vom Syntax-Hervorhebungsskript beansprucht.
Demonkoryu
Ja, ich stimme zu. Ich sage nur, dass die Speichernutzung sehr unwahrscheinlich ist, (a) ein Problem zu sein oder (b) eine lange Verzögerung zu verursachen, im Gegensatz zu Ihrer Antwort.
Leichtigkeitsrennen im Orbit
Du hast recht, ich habe meine Antwort entsprechend aktualisiert.
Demonkoryu
7

Sie können versuchen, es als Binärdatei zu laden. Ich hatte Glück damit für wirklich große Nicht-Text-Dateien

vim -b HUGEFILE

Es ist auch möglich, vim als Hex-Editor zu verwenden. Siehe: http://usevim.com/2012/06/20/vim-binary-files/

Steve Butler
quelle
4

Hoffentlich hat Ihr Problem mehr mit VIMs zu tun, die für temporäre Dateien (wie zum Beispiel Swap) mehr als RAM benötigen.

In vielen Fällen befinden sich die von VIM erstellten temporären Dateien im selben Verzeichnis wie die Datei, die Sie öffnen. Wenn dies bei Ihnen der Fall ist, können Sie dies überprüfen, indem Sie den verfügbaren Speicherplatz im aktuellen Verzeichnis überprüfen.

Zum Glück gibt es eine gute Dokumentation, wie Sie einen anderen Speicherort für die Index- / Auslagerungsdateien von VIM angeben können:

Sie können die Auslagerungsdatei auch deaktivieren

samt
quelle
1

Ich öffne gelegentlich große Datenbanksicherungen im .sql-Textformat. Sehr große Dateien oder Dateien mit sehr langen Zeilen scheinen manchmal lange zu dauern, bis sie in vim geöffnet werden. Dies könnte mit der Syntaxverarbeitung und der Hervorhebung von Farben zusammenhängen, wie in den Antworten von @zzapper und @demonkoryu erwähnt.

Eine schnelle Problemumgehung kann darin bestehen, während des Ladens der Datei "Strg-G" zu drücken, um die Syntaxhervorhebung abzubrechen.

digital
quelle