Ich sehe eine sehr unterschiedliche Leistung, abhängig davon, wie viele Zeilen in der Datei sind, die ich besuche.
Hier ist ein Beispiel. Ich habe zwei JSON-Dateien:
$ wget https://github.com/Wilfred/ReVo-utilities/blob/a4bdc40dd2656c496defc461fc19c403c8306d9f/revo-export/dictionary.json?raw=true -O one_line.json
$ python -m json.tool <one_line.json >pretty_printed.json
Dies sind zwei JSON-Dateien mit demselben Inhalt. one_line.json
ist 18 MB JSON ohne Zeilenumbruch. pretty_printed.json
Newlines und Whitespace hinzugefügt, so dass es 41MiB.
Die über viele Zeilen verteilte größere Datei lässt sich jedoch in Emacs sowohl im JavaScript-Modus als auch im Fundamental-Modus viel schneller öffnen.
Warum hat Emacs bei langen Leitungen eine so schlechte Leistung, weil es eigentlich weniger Bytes sind? Kann ich die Leistung verbessern, ohne die Daten außerhalb von Emacs neu zu formatieren?
line-break
performance
Wilfred Hughes
quelle
quelle
View Large Files
(VLF) ist ein kleiner Betrieb , das Ziel, mit der Bearbeitung von großen Dateien zu helfen , indem sie beim Laden Chargen . Haftungsausschluss: Ich habe es nie benutzt und ich weiß nicht, ob es auch lange Zeilen in Stapeln verarbeitet .$ tail -f /some/file | fold -s
in einem Shell-Puffer. Das ist natürlich nicht gut zum Bearbeiten, hilft aber beim Lesen.Antworten:
Emacs 'Umgang mit langen Schlangen ist nicht sehr gut optimiert. Für eine Reihe von Operationen muss Emacs die gesamte Zeile wiederholt scannen. Um beispielsweise eine Linie anzuzeigen, muss Emacs die Höhe der Linie ermitteln. Dazu muss die gesamte Linie gescannt werden, um die höchste Glyphe zu finden. Darüber hinaus nimmt das Scannen nach bidirektionaler Anzeige viel Zeit in Anspruch. Sie können einige zusätzliche Informationen erhalten, z. B. in der Dokumentzeichenfolge von
cache-long-line-scans
(cache-long-scans
in 24.4 umbenannt ).Sie können versuchen und sehen , ob Einstellung
bidi-paragraph-direction
aufleft-to-right
die Geschwindigkeit für Sie verbessert [Einstellungbidi-display-reordering
zunil
, tut mehr oder weniger das gleiche , sondern nur für den internen / Debug - Zwecke gedacht]. Dies entfernt einen signifikanten Beitrag zu Linienscans, aber leider nicht den einzigen.Die beste Option ist das Hinzufügen von Zeilenumbrüchen. Sie können eine JSON-Datei
python -c 'import json, sys ; json.dump(json.load(sys.stdin), sys.stdout, indent=2)'
weiterleiten, um z. B. neue Zeilen hinzuzufügen und die Lesbarkeit zu verbessern.quelle
(setq-default bidi-display-reordering nil)
- Einige Benutzer erkennen möglicherweise nicht, dass es sich um eine pufferlokale Variable handelt, für die möglicherweise eine Standardeinstellung erforderlich ist, sofern ein Benutzer dies als global wünscht. Ich wünschte, ich hätte das vor Jahren hinzugefügtinit.el
... aber zumindest ist es jetzt da. Vielen Dank !!!bidi-display-reordering
: "Ein Kommentar, den ich habe, ist, dass das Deaktivieren der Bidi-Anzeige-Neuordnung ... die Anzeige-Engine in einen Zustand versetzt, der nicht getestet wird, und Inkonsistenzen verursachen kann und sogar Fehler (weil einige Teile des Codes unter der Annahme geschrieben wurden, dass diese Variable niemals Null ist). "Ich habe einige kurze Experimente mit einer verkleinerten Kopie von jquery durchgeführt.
font-lock-mode
undflycheck-mode
beide trugen zur Langsamkeit, wie tatjs2-mode
, undprettify-symbols-mode
.line-number-mode
undcolumn-number-mode
hatte geringe Wirkung. Einmal hatte ich die verschiedenen Modi ausgeschaltet, obwohl die Leistung relativ bissig war. Verwenden C-h mund deaktivieren Sie verschiedene aktivierte Modi, oder wechseln Sie einfach zufundamental-mode
.Interessanterweise
hexl-mode
konnte ich die Datei ohne Probleme durchfliegen, obwohl die Spalten offensichtlich ziemlich kurz waren. Leidervisual-line-mode
sehr verlangsamt.Ich vermute, dass die Syntaxtabelle die Verarbeitung gerne an den Zeilenenden unterbricht, und wenn alles in einer Zeile steht, muss sie bei jedem Update alles neu analysieren.
quelle
Ich habe http://www.emacswiki.org/emacs/OverLongLineMode hochgeladen
Mit dieser Bibliothek können Sie einfache Schwellenwerte für die Zeilenlänge festlegen, ab denen
fundamental-mode
anstelle des normalen Modus eine Variante von für eine Datei verwendet wird (nur für Programmiermodi).Möglicherweise könnte Emacs standardmäßig etwas in diese Richtung hinzugefügt werden. Dies kann jedoch eine vorläufige Lösung für das Hauptproblem sein, dass Emacs beim Auffinden einer solchen Datei langsamer kriecht.
nb Dies ist eine Verbesserung gegenüber dem Code, den ich ursprünglich in dieser Antwort gepostet habe, aber immer noch in Arbeit. Das Testen war minimal. Kommentare sind willkommen.
Vorschläge für andere (außer
css-mode
) nicht-prog-mode
abgeleitete Hauptmodi, die standardmäßig unterstützt werden, werden ebenfalls begrüßt.quelle
so-long.el
active öffnete die datei in weniger als 2 sekunden. Das eigentliche Bearbeiten der Datei ist immer noch äußerst problematisch (z. B. der Versuch, in die nächste Zeile zu wechseln, wird extrem lange dauern), aber dennoch wird mein Vertrauen in die Nützlichkeit der von mir geschriebenen Bibliothek wiederhergestellt, sodass ich meine Pläne wieder aufnehmen sollte füge es zu GNU ELPA hinzu ...so-long.el
(mit zahlreichen Verbesserungen) ist in den aktuellen Entwicklungsversionen von Emacs 27 enthalten und wird in naher Zukunft (für frühere Versionen von Emacs) über GNU ELPA verfügbar sein.Ich nehme an, Sie werden feststellen, dass der Unterschied darauf zurückzuführen ist
font-lock
. Wenn die Schrift an der im Fenster sichtbaren Teilmenge der Datei vorgenommen werden soll, wird zunächst der Schriftbereich so erweitert, dass er vollständige semantische Einheiten enthält. Siehe dazu denfont-lock-extend-region-functions
Code. Es ist üblich, die Region auf vollständige Zeilen zu erweitern. Wenn die Zeilen extrem lang sind, kann dies dazu führen, dass die Fontifizierung über einen sehr viel größeren Teil des Inhalts ausgeführt wird, als tatsächlich sichtbar ist.Wenn Zeilenumbrüche selbst semantische Informationen enthalten, kann ihre Abwesenheit manchmal dazu führen, dass reguläre Ausdrücke für die Schriftsperre weiter gescannt werden müssen, um festzustellen, ob sie übereinstimmen oder nicht.
quelle
Normalerweise löse ich lange Zeilen auf und rücke nach Tags ein (wie HTML, XML, JSON).
Um eine solche Operation zu ermöglichen, füge ich hinzu:
I gespalten Linie durch regex, für XML es:
C-M-% >< RET >NL< RET !
.Nachdem Emacs lange Zeilen geteilt hat, können Sie viele
*-modes
Codes aktivieren und neu einrücken.Zum Hinweis: Wie kann eine Verlangsamung verhindert werden, wenn ein minderwertiger Prozess lange Schlangen erzeugt?
quelle
Ich habe hier meine eigene Lösung für dieses Problem erstellt: https://github.com/rakete/too-long-lines-mode
Ich war nicht zufrieden mit der phils-Lösung, die einen Puffer mit sehr langen Zeilen in den Fundamental-Modus versetzt. Ich wollte eine Lösung, mit der ich Syntax-Hervorhebungen und andere Hauptfeatures des Modus beibehalten kann. Deshalb habe ich einen Nebenmodus erstellt, der Überlagerungen verwendet, um die meisten Zeichen übermäßig langer Zeilen auszublenden.
Das umgeht das Problem und macht den Emacs auch in Puffern mit sehr langen Zeilen einsetzbar, ohne auf den Fundamental-Modus zurückgreifen zu müssen.
quelle
In meinem Emacs-Setup habe ich einen Modus mit benutzerdefinierter Schriftart, dh wo ich festgelegt habe
font-lock-defaults
. Eine einzelne Seite nach unten würde 30 Sekunden benötigen, um einen Teil der 30000-Zeichenzeile anzuzeigen. Diese Verlangsamung wurde behoben, indem das Regexp-Backtracking reduziert wurde. Anstatt von:mach das
quelle
font-lock-defaults
oder Regexp-Übereinstimmung geht.In meinen Shell-Mode-Puffern (Mx-Shell) muss ich Pipes verwenden
sed -r 's/(.{2000}).*/\1/' -u
, um lange Zeilen zu vermeiden.quelle
Ich benutze die folgende Funktion zum Öffnen in
dired-mode
großen Dateien mit langen Zeilen:quelle
Hier ist eine Problemumgehung aus Emacs-Devel :
quelle
longlines-mode
als überholt markiertvisual-line-mode
.visual-line-mode
helfen nicht bei dem fraglichen Problem, wohingegen dies derlonglines-mode
Fall ist. Aus diesem Grund erwarte ich, dass longlines.el auf einen nicht veralteten Status zurückgesetzt wird.