Чому Vim не може відкрити текстовий файл розміром 100 Мб, коли у мене є 16 Гб оперативної пам’яті?


67

У мене є файл резервного копіювання бази даних MySQL 100 Мб, і у мене виникли проблеми відкрити його у Vim на моєму Linux-полі, що має 16 ГП ОЗУ.

Вім просто висить (принаймні, непридатний). Це те, чого я не розумію. У мене є 16 Гб оперативної пам’яті, чому я не можу завантажити файл в 100 Мб в редактор?

Це через Віма? Я думав, що всім управлінням пам’яттю управляє ОС.


3
Для перегляду таких файлів рекомендується використовувати текстовий редактор замість текстового редактора. Прикладом шестигранного редактора з ві-подібним інтерфейсом hexer.
Руслан

13
Не забувайте, що оперативна пам’ять не була тією, з якої ми вичерпалися, коли у нас не вистачає пам'яті вже десятиліття. Тепер пам'ять віртуалізована; він розділений на сторінки, і ці сторінки можна поміняти на диск. Обсяг пам’яті, що виділяється з адресного простору процесу, і кількість споживаної оперативної пам’яті мають дуже мало спільного між собою. Коли у вас не вистачає пам'яті, у вас не вистачає адресного простору , а не ОЗУ . Найкращий спосіб подумати про це - пам'ять - це дисковий простір , кожен процес отримує певний фіксований обсяг цього простору, а оперативна пам'ять - це обладнання, яке робить ваш диск швидшим .
Ерік Ліпперт

21
@EricLippert За винятком того, що традиційні диски настільки повільні (порівняно з оперативною пам’яттю), що вони підходять лише для зберігання сторінок віртуальної пам’яті, які не активно використовуються. Якщо процес зависає (або принаймні є непридатним, як це заявив ОП) через обмінювання свопів, це саме тому, що оперативна пам'ять - це те, що у нього закінчилося.
декап

6
@EricLippert, у якому не вистачає адресного простору, сьогодні актуальний лише для 32-бітових систем. Я сумніваюся, що користувач з 16G ОЗУ все одно буде використовувати 32-бітове ядро ​​PAE замість звичайного 64-бітного.
Руслан

3
@depquid: Це хороший момент; Суть мого коментаря полягає в тому, що ОП, здається, має віру в те, що "я завантажив 100 МБ речей, у мене 16000 МБ оперативної пам'яті, тому 100 мільйонів моїх 16000 Мб оперативної пам'яті було витрачено". Ця система переконань застаріла.
Ерік Ліпперт

Відповіді:


69

Іноді Vim має проблеми з файлами, які мають незвично довгі рядки. Це текстовий редактор, тому він призначений для текстових файлів із довжиною рядків, яка зазвичай становить не більше кількох сотень символів.

Файл бази даних може не містити багато символів нового рядка, тому, можливо, це може бути один єдиний 100 Мб довгий рядок. Vim не буде задоволений цим, і хоча це, мабуть, спрацює, завантаження файлу може зайняти досить багато часу.

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


1
Я також помітив дуже довгі рядки, пробував з іншим файлом без дуже довгих рядків, бачу велике поліпшення. Спасибі
Запитуйте та

11
@AskandLearn Залежно від типу файлу, ви set synmaxcol=120(або якесь інше відповідне число) може побачити підвищення продуктивності . Я помітив величезні прискорення з цього в минулому.
сапі

Хтось знає, чи нещодавно вилка Neovim краще оброблятиме довші лінії? Я думаю, це не особливо поширене питання ...
Хеммер

@GregHewgill це правда, я також це спостерігав, але як ти це знав?
Рахул Патіль

56

На мій досвід, Vim задавлюється не на великих файлах , а на довгих рядках . За допомогою цієї команди можна mysqldumpвикористовувати короткі рядки за рахунок більшого файлу :

$ mysqldump --complete-insert -u -p

Крім того, ви можете відкрити Vim і попросити його не розбирати .vimrcфайл і не завантажувати додатки за допомогою цієї команди:

$ vim -u NONE output.sql

Таким чином, завантаження Vim використовуватиме менше пам’яті та не вимагатиме від Vim розбору всього файлу, як це роблять багато плагінів.


15

"завантажуйте VIM без .vimrc та плагінів (чистий VIM), наприклад, для ВЕЛИЧЕЗНИХ файлів

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

13

Спробуйте використовувати lessзамість того, vimякщо ви хочете переглянути великий файл безпосередньо. Під час першого завантаження Vim намагається зробити багато різних речей - сканування файлу (можливо, в декількох пропусках), щоб спробувати визначити, який синтаксис використовувати, і підсвічування синтаксису, і пошук моделей у верхній і нижній частині файлу. Тоді під час редагування файлу vim зберігає swapfiles та зберігає дерева скасування (історія скасування в vim розгалужується, не лінійна, як у кожному (?) Іншому редакторі), і постійно переоцінює підсвічування синтаксису під час зміни тексту тощо.

Ніщо з цього не обов'язково є виправданням того, чому він повинен бути таким непридатним для використання гігантських файлів, але це більше пояснення деяких причин, чому він є.


Дивіться мою відповідь про те, як запобігти виконанню VIM важких операцій, таких як розбір файлів.
dotancohen

Так, підсвічування синтаксису на таких речах, як XML і SQL, може отримувати дуже повільно на великих файлах.
Марцін

9

Vim не просто завантажує файл як є в пам'ять. Він перетворює його у внутрішні структури (рядки, слова тощо), виконує підсвічування синтаксису за допомогою внутрішньої мови скрипту тощо; все це споживає пам'ять (набагато більше, ніж байт для персонажа) та час процесора.


Споживання пам'яті - це навіть не проблема. Час роботи процесора (і видимий заморожування, поки ви чекаєте), є.
Гонки легкості по орбіті

Цей час процесора в основному зайнятий сценарієм виділення синтаксису.
demonkoryu

Так, я згоден. Я просто кажу, що використання пам'яті навряд чи (а) може стати проблемою або (б) спричинити тривалу затримку, всупереч тому, що говорить ваша відповідь.
Гонки легкості по орбіті

Ви маєте рацію, я відповідно оновив свою відповідь.
demonkoryu

7

Ви можете спробувати завантажити його як двійковий файл. Мені пощастило з справді великими нетекстовими файлами

vim -b HUGEFILE

Можливо також IIRC використовувати vim як шістнадцятковий редактор, див .: http://usevim.com/2012/06/20/vim-binary-files/


4

Сподіваємось, ваша проблема пов'язана з потребою VIM у тимчасових файлах (таких як swap) більше, ніж оперативна пам'ять.

У багатьох випадках тимчасові файли, створені VIM, знаходяться в одному каталозі файлу, який ви відкриваєте. Якщо це стосується вас, то ви можете перевірити, перевіривши наявний дисковий простір у поточному каталозі.

На щастя, є хороша документація про те, як можна вказати інше місце для файлів індексації / заміни VIM:

Ви також можете відключити файл swap


1

Я час від часу відкриваю великі резервні копії бази даних у текстовому форматі .sql. Дуже великі файли або файли з дуже довгими рядками іноді, здається, потребують багато часу, щоб відкрити vim. Це може бути пов'язано з обробкою синтаксису та виділенням кольорів, про що йдеться у відповідях @zzapper та @demonkoryu.

Швидким вирішенням може бути натискання "control-G" під час завантаження файлу, щоб скасувати виділення синтаксису попередньої обробки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.