Почему Vim не может открыть текстовый файл размером 100 МБ, если у меня 16 ГБ ОЗУ?

67

У меня есть файл резервной копии базы данных MySQL объемом 100 МБ, и я не могу открыть его в Vim на моем компьютере с Linux, имеющим 16 ГБ ОЗУ.

Vim просто зависает (по крайней мере, непригодно для использования). Это то, что я не понимаю. У меня 16 ГБ ОЗУ, почему я не могу загрузить файл размером 100 МБ в редактор?

Это из-за Вима? Я думал, что все управление памятью осуществляется ОС.

Спроси и изучи
источник
3
Попробуйте использовать HEX-редактор вместо текстового редактора для просмотра таких файлов. Примером шестнадцатеричного редактора с vi-подобным интерфейсом будет hexer.
Руслан
13
Не забывайте, что ОЗУ не было тем, что у нас кончается, когда у нас кончается память десятилетиями. Память теперь виртуализирована; он разделен на страницы, и эти страницы можно перенести на диск. Объем памяти, выделенный из адресного пространства процесса, и объем используемой оперативной памяти имеют очень мало общего друг с другом. Когда у вас заканчивается память, у вас заканчивается адресное пространство , а не оперативная память . Лучший способ думать об этом - память - это дисковое пространство , каждый процесс получает определенный фиксированный объем этого пространства, а оперативная память - это аппаратное обеспечение, которое ускоряет работу вашего диска .
Эрик Липперт
21
@EricLippert За исключением того, что традиционные диски настолько медленны (по сравнению с ОЗУ), что они подходят только для хранения страниц виртуальной памяти, которые не используются активно. Если процесс зависает (или, по крайней мере, его нельзя использовать, как выразился OP) из-за перестановки подкачки, это происходит именно потому, что у него закончилось ОЗУ.
Депвид
6
@EricLippert, исчерпывающий адресное пространство, актуален только в 32-битных системах сегодня. Я сомневаюсь, что пользователь с 16G RAM все еще будет использовать 32-битное ядро ​​PAE вместо обычного 64-битного.
Руслан
3
@depquid: Это хороший момент; Суть моего комментария в том, что у ОП, похоже, есть убеждение, что «я загрузил 100 МБ материала, у меня 16000 МБ ОЗУ, поэтому 100 МБ из 16000 МБ ОЗУ было использовано». Эта система убеждений устарела.
Эрик Липперт

Ответы:

69

Vim иногда имеет проблемы с файлами, которые имеют необычно длинные строки. Это текстовый редактор, поэтому он предназначен для текстовых файлов, длина строк которых обычно не превышает нескольких сотен символов.

Файл базы данных может не содержать много символов новой строки, поэтому он может представлять собой одну строку длиной 100 МБ. Vim не будет доволен этим, и, хотя он, вероятно, будет работать, загрузка файла может занять довольно много времени.

Я, конечно, открыл текстовые файлы намного больше, чем 100 Мб с Vim. Файл даже не должен помещаться в память все сразу (так как Vim может обмениваться изменениями на диске по мере необходимости).

Грег Хьюгилл
источник
1
Я также заметил очень длинные строки, пробовал с другим файлом без очень длинных строк, вижу большое улучшение. Спасибо
спрашивай и учись
11
@AskandLearn В зависимости от типа файла, вы можете увидеть увеличение производительности, если вы set synmaxcol=120(или какой-либо другой соответствующий номер). Я заметил огромные ускорения от этого в прошлом.
Сапи
Кто-нибудь знает, будет ли недавний неовим-форк лучше обрабатывать длинные строки? Я думаю, что это не особенно распространенная проблема ...
Хеммер
@GregHewgill это правда, я тоже это наблюдаю, но как ты это узнал?
Рахул Патил
56

По моему опыту, Vim задыхается не от больших файлов , а от длинных строк . Используйте эту команду, чтобы mysqldumpиспользовать более короткие строки за счет большего файла :

$ mysqldump --complete-insert -u -p

Кроме того, вы можете открыть Vim и попросить его не анализировать ваш .vimrcфайл или загружать какие-либо плагины с помощью этой команды:

$ vim -u NONE output.sql

Загрузка Vim таким образом потребует меньше памяти и не потребует Vim для анализа всего файла, как это делают многие плагины.

dotancohen
источник
15

"загрузить VIM без .vimrc и плагинов (чистый VIM), например, для огромных файлов

  gvim -u NONE -U NONE -N largefile.sql
zzapper
источник
13

Попробуйте использовать lessвместо, vimесли вы хотите просмотреть большой файл напрямую. При первой загрузке Vim пытается сделать много разных вещей - сканировать файл (возможно, за несколько проходов), чтобы попытаться определить, какой синтаксис использовать, и выполнить подсветку синтаксиса, а также поиск моделей в верхней и нижней частях файла. Затем, когда вы редактируете файл, vim сохраняет файлы подкачки и сохраняет деревья отмены (история отмен в vim - это ветвление, а не линейное, как в любом (?) Другом редакторе), и постоянно переоценивает подсветку синтаксиса при изменении текста и т. Д.

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

godlygeek
источник
Смотрите мой ответ о том, как запретить VIM выполнять тяжелые операции, такие как анализ файла.
dotancohen
Да, подсветка синтаксиса для таких вещей, как XML и SQL, может работать очень медленно на больших файлах.
Марцин
9

Vim не просто загружает файл как есть в память. Он преобразует его во внутренние структуры (строки, слова и т. Д.), Выполняет подсветку синтаксиса с использованием внутреннего языка сценариев и т. Д .; все это потребляет память (намного больше, чем байт для символа) и процессорное время.

demonkoryu
источник
Потребление памяти даже не проблема. Время ЦП, занимаемое (и видимое зависание, пока вы ждете), равно.
Легкость гонки с Моникой
Это процессорное время в основном используется сценарием подсветки синтаксиса.
демонкорю
Да, я согласен. Я просто говорю, что использование памяти очень маловероятно, чтобы (а) быть проблемой, или (б) вызвать длительную задержку, вопреки тому, что говорит ваш ответ.
Легкость гонки с Моникой
Вы правы, я обновил свой ответ соответственно.
демонкорю
7

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

vim -b HUGEFILE

Также IIRC может использовать vim в качестве шестнадцатеричного редактора, см .: http://usevim.com/2012/06/20/vim-binary-files/

Стив Батлер
источник
4

Надеюсь, ваша проблема больше связана с тем, что VIM нужны временные файлы (например, подкачки) больше, чем ОЗУ.

Во многих случаях временные файлы, созданные VIM, находятся в том же каталоге, что и файл, который вы открываете. Если это так, то вы можете проверить, проверив доступное дисковое пространство в текущем каталоге.

К счастью, есть хорошая документация о том, как вы можете указать другое местоположение для файлов индексации / обмена VIM:

Вы также можете отключить файл подкачки

SAMT
источник
1

Я иногда открываю большие резервные копии базы данных в текстовом формате .sql. Иногда очень большие файлы или файлы с очень длинными строками иногда открываются в vim. Это может быть связано с обработкой синтаксиса и выделением цвета, как упоминалось в ответах @zzapper и @demonkoryu.

Быстрый обходной путь может заключаться в том, чтобы нажать «control-G» во время загрузки файла, чтобы отменить предварительную обработку подсветки синтаксиса.

digitalsean
источник