Wie bearbeite ich Multi-Gigabyte-Textdateien? Vim funktioniert nicht = ([geschlossen]


112

Gibt es Editoren, die Textdateien mit mehreren Gigabyte bearbeiten können, indem sie möglicherweise nur kleine Teile gleichzeitig in den Speicher laden? Es scheint nicht so, als ob Vim damit umgehen kann = (


Ich habe wirklich große Datenerfassungsdateien in vim geladen und sie problemlos verarbeitet.
Turm

Abhängig von Ihren Bearbeitungsanforderungen können Sie es möglicherweise nur durch etwas wie sed oder perl leiten, um eine Suche durchzuführen und zu ersetzen.
El Yobo

23
Eigentlich ist es kein Off-Topic, viele Programmierer verwenden vim, manchmal als Ergänzung zum UI-Editor. Die Themenfrage betrifft ein echtes Problem. Wir alle kennen nur zwei so gute Werkzeuge der Schweizer Armee für diese Art von Aufgabe. Bitte behandeln Sie vim nicht als zu exotisch oder außerhalb des Geländes. SO ist für Menschen.
Sławomir Lenart

Verschieben Sie es nicht auf SuperUser, Linux / Unix oder VIM, anstatt es zu schließen.
user1271772

Antworten:


72

Wenn Sie auf * nix (und vorausgesetzt , Sie nur Teile der Datei (und selten) zu modifizieren haben), können Sie die Dateien aufgeteilt (mit dem splitBefehl), bearbeiten sie einzeln (mit awk, sedoder so ähnlich) und verketten sie , nachdem Sie sind fertig.

cat file2 file3 >> file1

10
Toller Tipp. Ich hatte eine SQL-Datei mit 13 GB (152.000.000 Zeilen), und die Verwendung von "split -l 1000000" und die Bearbeitung der Dateien mit einer Million Zeilen, die ich mit vim haben wollte, funktionierten hervorragend. Es dauerte 10 Minuten, um sie zu teilen. (Ich habe versucht, die Originaldatei mit vim zu öffnen, und das hat funktioniert, aber es war zu langsam, um verwendet werden zu können.)
Claes Mogren

149

Strg-C stoppt das Laden der Datei. Wenn die Datei klein genug ist, haben Sie möglicherweise das Glück gehabt, den gesamten Inhalt geladen und alle Schritte nach dem Laden beendet zu haben. Stellen Sie sicher, dass die gesamte Datei geladen wurde, wenn Sie diesen Tipp verwenden.

Vim kann ziemlich gut mit großen Dateien umgehen. Ich habe gerade eine 3,4-GB-Datei bearbeitet, Zeilen gelöscht usw. Drei Dinge, die Sie beachten sollten:

  1. Drücken Sie Strg-C: Vim versucht zunächst, die gesamte Datei einzulesen, um beispielsweise die Syntaxhervorhebung und die Anzahl der Zeilen in der Datei usw. auszuführen. Strg-C bricht diese Aufzählung (und die Syntaxhervorhebung) ab und lädt nur das, was vorhanden ist benötigt, um auf Ihrem Bildschirm anzuzeigen.
  2. Schreibgeschützt: Vim wird wahrscheinlich schreibgeschützt starten, wenn die Datei zu groß ist, um eine zu erstellen. Dateikopie, um die Änderungen vorzunehmen. Ich musste w! um die Datei zu speichern, und dann dauerte es die meiste Zeit.
  3. Zur Zeile gehen: :115355Wenn Sie tippen, gelangen Sie direkt zur Zeile 115355, die in diesen großen Dateien viel schneller ausgeführt wird. Vim scheint jedes Mal, wenn ein Zeilenpuffer geladen wird, von vorne zu scannen, und wenn Sie Strg-F gedrückt halten, um die Datei zu durchsuchen, wird es gegen Ende sehr langsam.

Hinweis - Wenn Ihre Vim-Instanz schreibgeschützt ist, weil Sie Strg-C gedrückt haben, hat Vim möglicherweise nicht die gesamte Datei in den Puffer geladen. In diesem Fall wird beim Speichern nur das gespeichert, was sich im Puffer befindet, nicht die gesamte Datei . Sie können schnell mit einem überprüfen G, um zum Ende zu springen, um sicherzustellen, dass alle Zeilen in Ihrer Datei vorhanden sind.


14
Konnte mit 44 Gigabyte Wikipedia XML Dump in Vim mit diesem Rat umgehen. (Strg-C).
Vancan1ty

1
Es wurde versucht, das Ende der 2,5-GB-Protokolldatei unter Windows zu lesen. Das Öffnen in gvim führte zu einem Speicherfehler, wenn mehr als 2 GB Speicher zugewiesen wurden. Beim Versuch des Strg-C-Tricks wurde das Laden der Datei in den Speicher gestoppt, es konnte jedoch nur der Teil der Datei angezeigt werden, den gvim laden konnte. Je länger ich gewartet habe, bevor ich Strg-C gedrückt habe, desto mehr von der Datei konnte ich sehen. Zum Ende der Datei zu navigieren oder den Rest der Datei zu laden war unmöglich (oder ich wusste nicht wie). Ein bisschen enttäuschend, dass vim der Aufgabe nicht gewachsen war: (Am Ende habe ich ein kostenloses dediziertes Tool verwendet, um die Datei in 100-MB-Dateien aufzuteilen.
Slawek

14
Funktioniert bei mir nicht Ich lade eine 3-GB-Datei, drücke Strg-C und dann wird der Inhalt angezeigt. Ich kann Bildlauf usw. bearbeiten, aber wenn ich am Ende des geladenen Teils angelangt bin (sagen wir 5%), wird es nicht mehr geladen (ich bleibe bei dem Teil der Datei, der ursprünglich geladen wurde, bis zu dem Punkt, an dem ich Strg-C gedrückt habe).
Patryk

1
Bestätigt, user3338098. Wenn Sie Strg-C drücken und nicht die gesamte Datei geladen wird (wie bereits erwähnt), wird beim Speichern nur das gespeichert, was Sie geladen haben. Das ist wahrscheinlich der Grund, warum es in erster Linie schreibgeschützt ist. Ich werde meinen Readonly-Punkt aktualisieren, um dies zu beachten.
Aaron R.

16
Das Befolgen dieser Anweisungen führte dazu, dass ich eine riesige Datei zerstörte, die ich gerade heruntergeladen hatte. Sie müssen Punkt 2 vollständig entfernen, da er im Wesentlichen Anweisungen enthält, die zu Datenverlust führen und die Sie erst am Ende des Beitrags erwähnen.
Neobyte

75

Es können Plugins sein, die dazu führen, dass es erstickt. (Syntaxhervorhebung, Falten usw.)

Sie können vim ohne Plugins ausführen.

vim -u "NONE" hugefile.log

Es ist minimalistisch, aber es gibt Ihnen zumindest die vi-Bewegungen, die Sie gewohnt sind.

syntax off

ist eine andere offensichtliche. Beschneiden Sie Ihre Installation und beschaffen Sie sich das, was Sie brauchen. Sie finden heraus, wozu es in der Lage ist und ob Sie eine Aufgabe auf andere Weise erledigen müssen.


3
Dies lädt immer noch die gesamte Datei in RAM ...
Totor

@Totor Ja, ich würde die Datei zuerst teilen, aber diese Einstellung würde Ihnen schnell die beste Vim-Leistung bringen, indem Sie zufällige automatische Befehle deaktivieren. Das war mein Punkt. Workstations mit anständigem Speicher sollten in der Lage sein, Dateien zu verarbeiten, die sich einem Gig nähern.
Michael

2
Also ist vim / vi nutzlos, wenn die Datei zehnmal so groß ist wie der virtuelle Speicher?
user3338098

1
Ich habe diesen Befehl verwendet, um eine 250-MB-Datei in weniger als 2 Sekunden zu öffnen. Erstaunlich
user674669

20

Eine leichte Verbesserung gegenüber der Antwort von @Al pachio mit der Split + Vim-Lösung. Sie können die Dateien mit einem Glob einlesen, indem Sie Dateiblöcke effektiv als Puffer verwenden, z

$ 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

Vielleicht möchten Sie dieses VIM-Plugin ausprobieren, das bestimmte Vim-Funktionen im Interesse der Geschwindigkeit beim Laden großer Dateien deaktiviert.


8

Ich habe versucht, dies zu tun, hauptsächlich mit Dateien um 1 GB, als ich eine kleine Änderung an einem SQL-Dump vornehmen musste. Ich bin auf Windows, was es sehr schmerzhaft macht. Es ist ernsthaft schwierig.

Die offensichtliche Frage ist: "Warum müssen Sie?" Ich kann Ihnen aus Erfahrung sagen, dass Sie dies mehr als einmal versuchen müssen. Sie möchten wahrscheinlich wirklich versuchen, einen anderen Weg zu finden.

Wie machst du das? Es gibt einige Möglichkeiten, wie ich es gemacht habe. Manchmal kann ich vim oder nano dazu bringen, die Datei zu öffnen, und ich kann sie verwenden. Das ist ein sehr harter Schmerz, aber es funktioniert.

Wenn das nicht funktioniert (wie in Ihrem Fall), haben Sie nur wenige Optionen. Sie können ein kleines Programm schreiben, um die erforderlichen Änderungen vorzunehmen (z. B. Suchen und Ersetzen). Sie könnten ein Befehlszeilenprogramm verwenden, das dies möglicherweise kann (möglicherweise kann es mit sed / awk / grep / etc ausgeführt werden?)

Wenn diese nicht funktionieren, können Sie die Datei jederzeit in Blöcke aufteilen (so etwas wie Aufteilen ist die naheliegende Wahl, aber Sie können Kopf / Schwanz verwenden, um das gewünschte Teil zu erhalten) und dann die Teile bearbeiten, die es benötigen. und später neu kombinieren.

Vertrauen Sie mir, versuchen Sie einen anderen Weg zu finden.


3
Normalerweise ist sed in solchen Fällen dein Freund. Ihr Redakteur mag es wirklich nicht, ein paar Zeichen oben in eine Datei einzufügen und herauszufinden, wie man alles andere nach unten drückt.
dkretz

@le dorfier: Ja. Ich habe sed verwendet, als ich suchen / ersetzen musste. Als ich ein paar Zeilen aus einer solchen Datei löschen musste (ein paar wahnsinnig lange Zeilen), habe ich es in vim geschafft, aber wie Sie sich vorstellen können, hat das Wechseln zwischen Zeilen (sowie das eigentliche Löschen) einige Zeit in Anspruch genommen (Sekunden + um zu antworten und neu zu zeichnen). Ich würde nicht versuchen wollen, einer dieser Zeilen auch nur ein paar Buchstaben hinzuzufügen.
MBCook

Genau das gleiche Problem ... eine "using" -Anweisung oben in einem SQL-Skript für eine große Tabelle oder eine Dateigruppe, die im Zielsystem nicht vorhanden ist. Ich benutze Free File Splitter, um sie zu zerstören, die Befehlszeile unten, um wieder beizutreten.
EBarr

6

Ich denke, es ist ziemlich üblich, dass Hex-Editoren große Dateien verarbeiten. Unter Windows verwende ich HxD , das behauptet, Dateien mit bis zu 8 EB (8 Milliarden Gigabyte) zu verarbeiten.


14
Es würde mich interessieren, wie sie das getestet haben ...: P
Shadow

Unter Linux empfehle ichhexedit
Elig

4

Ich verwende vim 7.3.3 unter Win7 x64 mit dem LargeFile-Plugin von Charles Campbell , um Multi-Gigabyte- Nur -Text-Dateien zu verarbeiten. Es funktioniert wirklich gut.

Ich hoffe du kommst richtig.


Wie können Sie das Plugin deaktivieren? ZB alle anderen Erweiterungen wie das Hervorheben wieder zum Laufen bringen, wenn eine Datei in Vim geöffnet ist?
hhh

3

Wow, ich habe es nie geschafft, Vim zum Würgen zu bringen, selbst mit ein oder zwei GB. Ich habe gehört, dass UltraEdit (unter Windows) und BBEdit (unter Macs) noch besser für noch größere Dateien geeignet sind, habe aber keine persönlichen Erfahrungen.




2

Ich habe den integrierten Editor / Viewer von FAR Commander für sehr große Protokolldateien verwendet.



1

Das einzige, was ich für so etwas verwenden konnte, ist mein Lieblings-Mac-Hex-Editor 0XED. Dies war jedoch bei Dateien der Fall, die ich mit zehn Megabyte als groß betrachtete. Ich bin mir nicht sicher, wie weit es gehen wird. Ich bin mir ziemlich sicher, dass nur Teile der Datei gleichzeitig in den Speicher geladen werden.


0

In der Vergangenheit habe ich erfolgreich einen Split / Edit / Join-Ansatz verwendet, wenn Dateien sehr groß werden. Damit dies funktioniert, müssen Sie wissen, wo sich der zu bearbeitende Text in der Originaldatei befindet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.