Jak edytować wielogigabajtowe pliki tekstowe? Vim nie działa = ([zamknięte]

112

Czy są jakieś edytory, które mogą edytować wielogigabajtowe pliki tekstowe, na przykład ładując tylko małe porcje do pamięci na raz? Nie wygląda na to, żeby Vim sobie z tym poradził = (

Philip Brocoum
źródło
Załadowałem w vimie naprawdę duże pliki akwizycji danych i poradziłem sobie z nimi bez problemu.
Rook
W zależności od potrzeb edycyjnych możesz po prostu przepuścić go przez coś takiego jak sed lub perl, aby przeprowadzić wyszukiwanie i zamianę.
El Yobo
23
Właściwie to nie jest poza tematem, wielu programistów używa Vima, czasami jako uzupełnienia edytora UI. Pytanie dotyczy prawdziwego problemu. Wszyscy znamy tylko dwa takie dobre narzędzia armii szwajcarskiej do tego rodzaju zadań, więc proszę nie traktuj vima jako zbyt egzotycznego lub zewnętrznego. SO jest dla ludzi.
Sławomir Lenart,
Zamiast go zamykać, dlaczego nie przenieść go do SuperUser lub Linux / Unix lub VIM?
user1271772

Odpowiedzi:

72

Jeśli jesteś na * nix (i zakładając, że masz do modyfikacji tylko części pliku (i rzadko)), można podzielić pliki (za pomocą splitpoleceń), edytować je pojedynczo (za pomocą awk, sedlub coś podobnego) i łączyć je po ciebie są skończone.

cat file2 file3 >> file1
Al pacino
źródło
10
Świetna wskazówka. Miałem plik sql o rozmiarze 13 GB (152.000.000 linii) i po prostu używając "split -l 1000000", a potem edytowałem milion plików liniowych tam, gdzie chciałem, z vimem działało świetnie. Dzielenie ich zajęło 10 minut. (Próbowałem otworzyć oryginalny plik za pomocą vima i to działało, ale było zbyt wolne, aby można było go używać.)
Claes Mogren
149

Ctrl-C zatrzyma ładowanie pliku. Jeśli plik jest wystarczająco mały, być może miałeś szczęście, że załadowałeś całą zawartość i po prostu zabiłeś wszystkie kroki po załadowaniu. Sprawdź, czy cały plik został załadowany podczas korzystania z tej wskazówki.

Vim całkiem dobrze radzi sobie z dużymi plikami. Właśnie wyedytowałem plik 3,4 GB, usuwając wiersze itp. Trzy rzeczy, o których należy pamiętać:

  1. Wciśnij Ctrl-C: Vim na początku próbuje wczytać cały plik, aby zrobić takie rzeczy jak podświetlenie składni i liczba linii w pliku, itp. Ctrl-C anuluje to wyliczenie (i podświetlanie składni) i załaduje tylko to, co jest potrzebne do wyświetlenia na ekranie.
  2. Tylko do odczytu: Vim prawdopodobnie rozpocznie tryb tylko do odczytu, gdy plik będzie zbyt duży, aby mógł utworzyć rozszerzenie. kopia pliku, aby przeprowadzić edycję. Musiałem w! aby zapisać plik, i wtedy zajęło to najwięcej czasu.
  3. Idź do wiersza: wpisywanie :115355przeniesie Cię bezpośrednio do wiersza 115355, który jest znacznie szybszy w przypadku dużych plików. Vim wydaje się zaczynać skanowanie od początku za każdym razem, gdy ładuje bufor linii, a przytrzymanie Ctrl-F w celu przeskanowania pliku wydaje się działać bardzo wolno pod koniec.

Uwaga - Jeśli twoja instancja Vima jest w trybie tylko do odczytu, ponieważ wcisnąłeś Ctrl-C, możliwe, że Vim nie załadował całego pliku do bufora. Jeśli tak się stanie, zapisanie go zapisze tylko to, co jest w buforze, a nie cały plik . Możesz szybko sprawdzić za pomocą a, Gaby przejść do końca, aby upewnić się, że wszystkie wiersze w pliku tam są.

Aaron R.
źródło
14
Był w stanie poradzić sobie z 44 gigabajtowym zrzutem xml wikipedii w vimie, korzystając z tej porady. (ctrl-c).
vancan1ty
1
Próbowano odczytać koniec pliku dziennika 2,5 GB w systemie Windows. Otwarcie w gvim spowodowało błąd braku pamięci, gdy przekroczył on 2 GB przydzielonej pamięci. Próbując sztuczki ctrl-c, zatrzymał ładowanie pliku do pamięci, ale pozwolił zobaczyć tylko część pliku, którą gvim był w stanie załadować. Więc im dłużej czekałem przed naciśnięciem ctrl-c, tym więcej pliku mogłem zobaczyć. Przejście do końca pliku lub załadowanie reszty pliku było niemożliwe (lub nie wiedziałem jak). Trochę rozczarowujące, że vim nie sprostał zadaniu: (W końcu użyłem darmowego dedykowanego narzędzia do podzielenia pliku na pliki 100MB.
slawek
14
Nie działa na mnie. Wczytuję plik 3GB, wciskam ctrl-c i pojawia się zawartość. Mogę edytować scroll itp., Ale kiedy dojdę do końca załadowanej części (powiedzmy 5%), to już się nie ładuje (utknąłem z częścią pliku, która została załadowana początkowo do momentu, w którym nacisnąłem ctrl-c)
Patryk
1
Potwierdzone, user3338098. Jeśli naciśniesz Ctrl-C i nie załaduje się całego pliku (jak mówili inni), zapisanie go zapisuje tylko to, co załadowałeś. Prawdopodobnie dlatego w pierwszej kolejności trafia do tylko do odczytu. Zaktualizuję mój punkt Readonly, aby to zauważyć.
Aaron R.
16
Postępowanie zgodnie z tymi instrukcjami spowodowało, że zniszczyłem ogromny plik, który właśnie pobrałem. Musisz całkowicie usunąć punkt 2, ponieważ w zasadzie podaje instrukcje powodujące utratę danych, o których nie wspominasz do końca postu.
Neobyte
75

Mogą to być wtyczki, które powodują jego dławienie. (podświetlanie składni, fałdy itp.)

Możesz uruchomić vima bez wtyczek.

vim -u "NONE" hugefile.log

Jest minimalistyczny, ale przynajmniej da ci ruchy vi, do których jesteś przyzwyczajony.

syntax off

jest kolejnym oczywistym. Usuń instalację i pobierz to, czego potrzebujesz. Dowiesz się, do czego jest zdolny i czy musisz wykonać zadanie w inny sposób.

Michael
źródło
3
To nadal ładuje cały plik do pamięci RAM ...
Totor
@Totor tak, najpierw podzieliłbym plik, ale to ustawienie szybko zapewniłoby najlepszą wydajność Vima, wyłączając losowe autokomendy. To był mój punkt widzenia. Stacje robocze z przyzwoitą pamięcią powinny być w stanie obsłużyć pliki zbliżające się do koncertu.
michael
2
więc vim / vi jest bezużyteczny, gdy plik jest 10 razy większy od pamięci wirtualnej?
user3338098
1
Użyłem tego polecenia, aby otworzyć plik 250 MB w mniej niż 2 sekundy. Niesamowite
user674669
20

Nieznaczne ulepszenie odpowiedzi udzielonej przez @Al pachio dzięki rozwiązaniu split + vim możesz wczytywać pliki za pomocą globu, efektywnie wykorzystując fragmenty plików jako bufor, np.

$ 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
Amos Folarin
źródło
15

Możesz chcieć sprawdzić tę wtyczkę VIM, która wyłącza niektóre funkcje VIM w interesie szybkości podczas ładowania dużych plików.

RedBlueThing
źródło
8

Próbowałem to zrobić, głównie z plikami o wielkości około 1 GB, kiedy musiałem wprowadzić małą zmianę w zrzucie SQL. Korzystam z systemu Windows, co sprawia, że ​​jest to poważny problem. To naprawdę trudne.

Oczywiste pytanie brzmi: „dlaczego musisz?” Z doświadczenia mogę ci powiedzieć, że próbujesz tego więcej niż raz, prawdopodobnie naprawdę chcesz spróbować znaleźć inny sposób.

Jak więc to robisz? Zrobiłem to na kilka sposobów. Czasami mogę uzyskać vim lub nano, aby otworzyć plik i mogę ich użyć. To naprawdę ciężki ból, ale działa.

Jeśli to nie zadziała (jak w twoim przypadku), masz tylko kilka opcji. Możesz napisać mały program, aby wprowadzić potrzebne zmiany (na przykład wyszukaj i zamień). Możesz użyć programu wiersza poleceń, który może to zrobić (może można to zrobić za pomocą sed / awk / grep / etc?)

Jeśli to nie zadziała, zawsze możesz podzielić plik na części (coś takiego jak split jest oczywistym wyborem, ale możesz użyć nagłówka / ogona, aby uzyskać żądaną część), a następnie edytować części, które tego potrzebują, i połączyć ponownie później.

Zaufaj mi jednak, spróbuj znaleźć inny sposób.

MBCook
źródło
3
Zazwyczaj sed jest twoim przyjacielem w takich przypadkach. Twojemu edytorowi naprawdę nie podoba się myśl o wstawieniu kilku znaków na początku pliku i zastanowieniu się, jak spuścić wszystko inne w dół.
dkretz
@le dorfier: Tak. Użyłem seda, gdy musiałem przeprowadzić wyszukiwanie / zamianę. Kiedy musiałem usunąć kilka linii z takiego pliku (kilka niesamowicie długich linii), udało mi się to zrobić w vimie, ale jak możesz się domyślić, poruszanie się między wierszami (a także faktyczne usuwanie) zajęło trochę czasu (sekundy + na odpowiedź i przerysowanie). Nie chciałbym próbować dodawać nawet kilku liter do jednej z tych linii.
MBCook
Dokładnie ten sam problem… instrukcja „using” na górze skryptu SQL dla dużej tabeli lub grupy plików, która nie istnieje w systemie docelowym. Używam Free File Splitter, aby je zniszczyć, wiersz poleceń poniżej, aby ponownie dołączyć.
EBarr
6

Myślę, że edytory szesnastkowe dość często obsługują duże pliki. W systemie Windows używam HxD , który twierdzi, że obsługuje pliki do 8 EB (8 miliardów gigabajtów).

John Y
źródło
14
Chciałbym wiedzieć, jak to przetestowali ...: P
Cień
Na Linuksie polecamhexedit
elig
4

Używam vim 7.3.3 na Win7 x64 z wtyczką LargeFile autorstwa Charlesa Campbella do obsługi wielogigabajtowych zwykłych plików tekstowych. Działa naprawdę dobrze.

Mam nadzieję, że dobrze przyjdziesz.

AndrewJacksonZA
źródło
Jak możesz wyłączyć wtyczkę? Na przykład, aby wszystkie inne rozszerzenia, takie jak podświetlanie, działały ponownie, gdy plik jest otwarty w Vimie?
hhh
3

Wow, nigdy nie udało mi się zmusić Vima do dławienia się, nawet z GB lub dwoma. Słyszałem, że UltraEdit (w systemie Windows) i BBEdit (na komputerach Mac) są jeszcze bardziej odpowiednie dla jeszcze większych plików, ale nie mam osobistego doświadczenia.

Alex Martelli
źródło
2

Użyłem wbudowanego edytora / przeglądarki FAR Commander do bardzo dużych plików dziennika.

azheglov
źródło
1

Użyłem TextPada do dużych plików dziennika, które nie mają górnego limitu.

bstoney
źródło
1

Jedyne, czego udało mi się użyć do czegoś takiego, to mój ulubiony edytor szesnastkowy na Maca, 0XED. Jednak dotyczyło to plików, które uważałem za duże i zajmowały dziesiątki megabajtów. Nie jestem pewien, jak daleko to zajdzie. Jestem jednak prawie pewien, że jednocześnie ładuje tylko części pliku do pamięci.

AriX
źródło
0

W przeszłości z powodzeniem stosowałem metodę dzielenia / edycji / łączenia, gdy pliki stają się bardzo duże. Aby to zadziałało, musisz wiedzieć, gdzie w oryginalnym pliku znajduje się tekst przeznaczony do edycji.

Ser
źródło