Dlaczego Vim nie może otworzyć pliku tekstowego 100 MB, gdy mam 16 GB pamięci RAM?


67

Mam plik kopii zapasowej bazy danych MySQL 100 MB i mam problem z otwarciem go w Vimie na moim komputerze z systemem Linux, który ma 16 GB pamięci RAM.

Vim po prostu się zawiesza (przynajmniej nie nadaje się do użytku). To jest coś, czego nie rozumiem. Mam 16 GB pamięci RAM, dlaczego nie mogę załadować pliku 100 MB w edytorze?

Czy to z powodu Vima? Myślałem, że zarządzanie pamięcią jest obsługiwane przez system operacyjny.


3
Rozważ użycie takiego edytora zamiast edytora tekstowego. Przykładem edytora szesnastkowego z interfejsem vi hexer.
Ruslan

13
Nie zapominaj, że od dziesięcioleci brakuje pamięci RAM, kiedy zabrakło nam pamięci . Pamięć jest teraz zwirtualizowana; jest podzielony na strony i strony te można zamienić na dysk. Ilość pamięci przydzielonej z przestrzeni adresowej procesu i ilość pamięci RAM mają niewiele wspólnego ze sobą. Gdy zabraknie pamięci, zabraknie przestrzeni adresowej , a nie pamięci RAM . Najlepszym sposobem, aby o tym pomyśleć, jest pamięć, miejsce na dysku , każdy proces otrzymuje określoną stałą ilość tego miejsca, a pamięć RAM to sprzęt, który przyspiesza dysk .
Eric Lippert,

21
@EricLippert Z wyjątkiem tego, że tradycyjne dyski są tak wolne (w porównaniu do pamięci RAM), że nadają się tylko do przechowywania stron pamięci wirtualnej, które nie są aktywnie używane. Jeśli proces zawiesza się (lub przynajmniej jest bezużyteczny, jak to określił PO) z powodu zamiany thrash, to właśnie dlatego, że zabrakło pamięci RAM.
depquid

6
@EricLippert zaczyna brakować przestrzeni adresowej, dotyczy tylko systemów 32-bitowych. Wątpię, aby użytkownik z 16G RAM nadal używał 32-bitowego jądra PAE zamiast normalnego 64-bitowego.
Ruslan

3
@depquid: To dobra uwaga; sednem mojego komentarza jest to, że OP wydaje się mieć przekonanie, że „Załadowałem 100 MB rzeczy, mam 16000 MB pamięci RAM, więc zużyłem 100 MB mojej 16000 MB pamięci RAM”. Ten system przekonań jest przestarzały.
Eric Lippert

Odpowiedzi:


69

Vim czasami ma problemy z plikami, które mają niezwykle długie linie. Jest to edytor tekstowy, więc jest przeznaczony do plików tekstowych o długości linii zwykle wynoszącej maksymalnie kilkaset znaków.

Plik bazy danych może nie zawierać wielu znaków nowego wiersza, więc może to być pojedyncza linia o długości 100 Mb. Vim nie będzie z tego zadowolony i chociaż prawdopodobnie będzie działać, załadowanie pliku może potrwać dość długo.

Z pewnością otworzyłem w Vimie pliki tekstowe znacznie większe niż 100 Mb. Plik nie musi nawet mieścić się w pamięci naraz (ponieważ Vim może w razie potrzeby zamieniać zmiany na dysku).


1
Zauważyłem też bardzo długie linie, próbowałem z innym plikiem bez bardzo długich linii, widzę dużą poprawę. Dzięki
Zapytaj i

11
@AskandLearn W zależności od typu pliku może wystąpić wzrost wydajności, jeśli Ty set synmaxcol=120(lub inny odpowiedni numer). W przeszłości zauważyłem ogromne przyspieszenie.
sapi

Czy ktoś wie, czy ostatni widelec neovim lepiej poradzi sobie z dłuższymi liniami? Chyba nie jest to szczególnie częsty problem ...
Hemmer

@GregHewgill to prawda, też to zauważyłem, ale skąd to wiesz?
Rahul Patil

56

Z mojego doświadczenia wynika, że ​​Vim dusi się nie na dużych plikach , ale na długich liniach . Użyj tego polecenia, aby mysqldumpużyć krótszych linii kosztem większego pliku :

$ mysqldump --complete-insert -u -p

Ponadto możesz otworzyć Vima i poprosić go, aby nie analizował .vimrcpliku ani nie ładował żadnych wtyczek za pomocą tego polecenia:

$ vim -u NONE output.sql

Załadowanie Vima w ten sposób zużyje mniej pamięci i nie będzie wymagało od Vima parsowania całego pliku, jak robi to wiele wtyczek.


15

msgstr "ładuj VIM bez .vimrc i wtyczek (czyste VIM) np. dla OGROMNYCH plików

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

13

Spróbuj użyć lesszamiast, vimjeśli chcesz bezpośrednio wyświetlić duży plik. Vim próbuje zrobić wiele różnych rzeczy przy pierwszym ładowaniu - skanuje plik (potencjalnie w wielu przebiegach), aby spróbować ustalić, jakiej składni użyć, i podświetlać składnię oraz wyszukiwać modeliny na górze i na dole pliku. Następnie podczas edycji pliku vim zapisuje pliki wymiany i przechowuje cofanie drzew (historia cofania w vimie rozgałęzia się, nie jest liniowa, jak w każdym (?) Innym edytorze) i stale ocenia podświetlanie składni wraz ze zmianami tekstu itp.

Nic z tego niekoniecznie uzasadnia, dlaczego musi być tak bezużyteczne w przypadku gigantycznych plików, ale jest raczej wyjaśnieniem niektórych powodów, dla których tak jest.


Zobacz moją odpowiedź, w jaki sposób uniemożliwić VIM wykonywanie ciężkich operacji, takich jak parsowanie plików.
dotancohen

Tak, podświetlanie składni na rzeczach takich jak XML i SQL może być bardzo powolne w przypadku większych plików.
Marcin

9

Vim nie tylko ładuje plik „tak jak jest” do pamięci. Konwertuje go na struktury wewnętrzne (linie, słowa itp.), Dokonuje podświetlania składni za pomocą wewnętrznego języka skryptowego i tak dalej; z których wszystkie zajmują pamięć (o wiele więcej niż bajt dla postaci) i czas procesora.


Zużycie pamięci nie jest nawet problemem. Czas procesora jest zajęty (i widoczne zawieszenie podczas oczekiwania).
Wyścigi lekkości na orbicie

Ten czas procesora jest w większości zajmowany przez skrypt podświetlania składni.
demonkoryu

Tak, zgadzam się. Mówię tylko, że wykorzystanie pamięci jest bardzo mało prawdopodobne, aby (a) stanowić problem lub (b) powodować duże opóźnienie, w przeciwieństwie do tego, co mówi twoja odpowiedź.
Wyścigi lekkości na orbicie

Masz rację, odpowiednio zaktualizowałem swoją odpowiedź.
demonkoryu


4

Mamy nadzieję, że twój problem dotyczy bardziej plików VIM potrzebnych do plików tymczasowych (takich jak wymiana), a nie pamięci RAM.

W wielu przypadkach pliki tymczasowe utworzone przez VIM znajdują się w tym samym katalogu, który otwierasz. Jeśli tak jest w Twoim przypadku, możesz to sprawdzić, sprawdzając dostępne miejsce na dysku w bieżącym katalogu.

Na szczęście istnieje dobra dokumentacja na temat tego, jak określić inną lokalizację plików indeksowania / wymiany VIM:

Możesz także wyłączyć plik wymiany


1

Czasami otwieram duże kopie zapasowe bazy danych w formacie tekstowym .sql. Bardzo duże pliki lub pliki z bardzo długimi liniami często wydają się długo otwierać w vimie. Może to być związane z przetwarzaniem składni i podświetlaniem kolorów, jak wspomniano w odpowiedziach @zzapper i @demonkoryu.

Szybkim obejściem może być naciśnięcie „control-G” podczas ładowania pliku, aby anulować wstępne przetwarzanie podświetlania składni.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.