Как редактировать многогигабайтные текстовые файлы? Vim не работает = ([закрыто]

112

Существуют ли какие-либо редакторы, которые могут редактировать текстовые файлы размером в несколько гигабайт, возможно, загружая в память только небольшие части за раз? Не похоже, что Vim может с этим справиться = (

Филип Брокум
источник
Я загрузил в vim действительно большие файлы сбора данных, и он без проблем с ними справился.
Rook
В зависимости от ваших потребностей в редактировании вы можете просто передать его через что-то вроде sed или perl, чтобы выполнить поиск и заменить.
El Yobo
23
На самом деле это не не по теме, многие программисты используют vim, иногда как дополнение к редактору пользовательского интерфейса. Тема вопроса касается реальной проблемы. Все мы знаем только два таких хороших инструмента швейцарской армии для такого рода задач, поэтому, пожалуйста, не относитесь к vim как к слишком экзотическим или сторонним. ТАК для людей.
Славомир Ленарт
Вместо того, чтобы закрыть его, почему бы не переместить его в SuperUser, Linux / Unix или VIM?
user1271772

Ответы:

72

Если вы на * NIX (и предполагая , что вы должны изменить только части файла (и редко)), вы можете разделить файлы ( с помощью splitкоманды), редактировать их по отдельности ( с использованием awk, sedили что - то подобное) и сцепить их после того, как вам сделано.

cat file2 file3 >> file1
Аль Пачино
источник
10
Отличный совет. У меня был sql-файл размером 13 ГБ (152 000 000 строк), и я просто использовал "split -l 1000000", а затем редактировал один миллион строчных файлов там, где я хотел, с помощью vim. Потребовалось 10 минут, чтобы их разделить. (Я попытался открыть исходный файл с помощью vim, и это сработало, но он был слишком медленным, чтобы его можно было использовать.)
Клас Могрен
149

Ctrl-C остановит загрузку файла. Если файл достаточно мал, вам, возможно, повезло, что вы загрузили все содержимое и просто убили все шаги пост-загрузки. При использовании этого совета убедитесь, что загружен весь файл.

Vim неплохо справляется с большими файлами. Я только что отредактировал файл размером 3,4 ГБ, удалив строки и т. Д. Следует помнить о трех вещах:

  1. Нажмите Ctrl-C: Vim сначала пытается прочитать весь файл, чтобы сделать такие вещи, как выделение синтаксиса, количество строк в файле и т. Д. Ctrl-C отменит это перечисление (и выделение синтаксиса), и загрузит только то, что необходимо отобразить на вашем экране.
  2. Только для чтения: Vim, скорее всего, перейдет в режим только для чтения, если файл слишком велик для создания файла. копия файла для редактирования. Пришлось ж! чтобы сохранить файл, и именно тогда это заняло больше всего времени.
  3. Перейти к строке: ввод :115355приведет вас прямо к строке 115355, что намного быстрее в таких больших файлах. Кажется, что Vim начинает сканирование с самого начала каждый раз, когда загружает буфер строк, и удерживание Ctrl-F для сканирования файла кажется очень медленным ближе к его концу.

Примечание. Если ваш экземпляр Vim находится в режиме только для чтения, потому что вы нажали Ctrl-C, возможно, Vim не загрузил весь файл в буфер. Если это произойдет, при сохранении сохранится только то, что находится в буфере, а не весь файл . Вы можете быстро проверить с помощью a, Gчтобы перейти к концу и убедиться, что все строки в вашем файле присутствуют.

Аарон Р.
источник
14
С помощью этого совета смог справиться с 44-гигабайтным дампом wikipedia xml в vim. (ctrl-c).
vancan1ty
1
Пытался прочитать конец файла журнала размером 2,5 ГБ в Windows. Открытие в gvim приводило к ошибке нехватки памяти, когда было выделено более 2 ГБ памяти. При попытке использовать трюк ctrl-c он остановил загрузку файла в память, но позволил увидеть только ту часть файла, которую gvim смог загрузить. Так что чем дольше я ждал, прежде чем нажать ctrl-c, тем большую часть файла я смог увидеть. Перейти к концу файла или загрузить остальную часть файла было невозможно (или я не знал как). Какое-то разочарование, что vim не справился с этой задачей: (В конце концов, я использовал какой-то бесплатный специальный инструмент, чтобы разбить файл на файлы
размером
14
У меня не работает. Я загружаю файл размером 3 ГБ, нажимаю ctrl-c, и появляется содержимое. Я могу редактировать прокрутку и т. Д., Но когда я дохожу до конца загруженной части (скажем, 5%), она больше не загружается (я застрял в той части файла, которая загружалась изначально, до момента, когда я нажал ctrl-c)
Патрик
1
Подтверждено, user3338098. Если вы нажимаете Ctrl-C, и он не загружает весь файл (как говорили другие), его сохранение сохраняет только то, что вы загрузили. Вероятно, поэтому он в первую очередь попадает в режим только для чтения. Я обновлю свою точку только для чтения, чтобы отметить это.
Аарон Р.
16
Следуя этим инструкциям, я уничтожил только что скачанный огромный файл. Вам нужно полностью удалить пункт 2, поскольку он в основном дает инструкции, вызывающие потерю данных, о которых вы не упоминаете до конца сообщения.
Neobyte
75

Это могут быть плагины, которые заставляют его задыхаться. (выделение синтаксиса, складки и т. д.)

Вы можете запускать vim без плагинов.

vim -u "NONE" hugefile.log

Это минималистично, но по крайней мере даст вам привычные движения vi.

syntax off

еще один очевидный. Сократите установку и найдите то, что вам нужно. Вы узнаете, на что он способен и нужно ли вам решать задачу другими способами.

Майкл
источник
3
Это по-прежнему загружает весь файл в ОЗУ ...
Тотор
@Totor да, я бы сначала разделил файл, но этот параметр быстро даст вам лучшую производительность vim, отключив случайные автокоманды. Это была моя точка зрения. Рабочие станции с приличной памятью должны уметь обрабатывать файлы, приближающиеся к гигабайту.
Майкл
2
Значит, vim / vi бесполезен, когда размер файла в 10 раз превышает размер виртуальной памяти?
user3338098
1
Я использовал эту команду, чтобы открыть файл размером 250 МБ менее чем за 2 секунды. Удивительно
user674669
20

Небольшое улучшение ответа, данного @Al pachio, с решением split + vim, вы можете читать файлы с помощью glob, эффективно используя фрагменты файлов в качестве буфера, например

$ 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

Возможно, вы захотите проверить этот плагин VIM, который отключает определенные функции vim в интересах скорости при загрузке больших файлов.

RedBlueThing
источник
8

Я пытался сделать это, в основном с файлами размером около 1 ГБ, когда мне нужно было внести небольшие изменения в дамп SQL. Я использую Windows, и это очень больно. Это серьезно сложно.

Возникает очевидный вопрос: «а зачем вам это нужно?». Я могу сказать вам по опыту, когда вам приходилось пробовать это более одного раза, вы, вероятно, действительно хотите попробовать найти другой способ.

Итак, как вы это делаете? Я сделал это несколькими способами. Иногда я могу заставить vim или nano открыть файл, и я могу их использовать. Это действительно тяжелая боль, но она работает.

Когда это не сработает (как в вашем случае), у вас есть только несколько вариантов. Вы можете написать небольшую программу для внесения необходимых вам изменений (например, поиск и замену). Вы можете использовать программу командной строки, которая может это сделать (может быть, это можно сделать с помощью sed / awk / grep / etc?)

Если это не сработает, вы всегда можете разделить файл на куски (что-то вроде split является очевидным выбором, но вы можете использовать голову / хвост, чтобы получить нужную часть), а затем отредактировать части, которые в ней нуждаются, а потом рекомбинировать.

Однако поверьте мне, попробуйте найти другой способ.

MBCook
источник
3
Обычно sed - ваш друг в подобных случаях. Вашему редактору очень не нравится мысль о том, чтобы вставить несколько символов в начало файла и выяснить, как сдвинуть все остальное вниз.
dkretz
@le dorfier: Ага. Я использовал sed, когда мне нужно было выполнить поиск / замену. Когда мне пришлось удалить несколько строк из такого файла (несколько безумно длинных строк), мне удалось это сделать в vim, но, как вы можете догадаться, перемещение между строками (а также фактическое удаление) заняло довольно много времени (секунды + для ответа и перерисовки). Я бы не стал пытаться добавить хотя бы несколько букв к одной из этих строк.
MBCook
Точно такая же проблема .... оператор using в верхней части сценария SQL для большой таблицы или группы файлов, которая не существует в целевой системе. Я использую Free File Splitter, чтобы разбить их, командная строка ниже, чтобы присоединиться.
EBarr
6

Я думаю, что шестнадцатеричные редакторы довольно часто обрабатывают огромные файлы. В Windows я использую HxD , который утверждает, что обрабатывает файлы размером до 8 ЭБ (8 миллиардов гигабайт).

Джон Y
источник
14
Мне было бы интересно узнать, как они это проверили ...: P
Shadow
На linux рекомендуюhexedit
elig
4

Я использую vim 7.3.3 в Win7 x64 с плагином LargeFile Чарльза Кэмпбелла для обработки многогигабайтных простых текстовых файлов. Это действительно хорошо работает.

Надеюсь, ты справишься.

ЭндрюДжексонZA
источник
Как можно отключить плагин? Например, заставить все другие расширения, такие как выделение, снова работать, когда файл открыт в Vim?
ххх
3

Вау, никогда не удавалось заставить vim подавиться, даже с одним или двумя ГБ. Я слышал, что UltraEdit (в Windows) и BBEdit (на Mac) даже больше подходят для файлов еще большего размера, но у меня нет личного опыта.

Алекс Мартелли
источник
2

Я использовал встроенный редактор / просмотрщик FAR Commander для сверхбольших файлов журналов.

ажеглов
источник
1

Я использовал TextPad для больших файлов журнала, у него нет верхнего предела.

bstoney
источник
1

Единственное, что я смог использовать для чего-то подобного, - это мой любимый шестнадцатеричный редактор Mac, 0XED. Однако это было с файлами, которые я считал большими - десятки мегабайт. Я не уверен, как далеко это зайдет. Однако я почти уверен, что он загружает в память только части файла за раз.

АРИКС
источник
0

В прошлом я успешно использовал подход разделения / редактирования / объединения, когда файлы становились очень большими. Чтобы это работало, вы должны знать, где находится редактируемый текст в исходном файле.

Cheeso
источник