Як редагувати багатогігабайтні текстові файли? Vim не працює = ([закрито]


112

Чи є редактори, які можуть редагувати багатогігабайтні текстові файли, можливо, завантажуючи одразу лише невеликі частини в пам'ять? Здається, Vim не впорається з цим = (


Я завантажив справді великі файли збору даних у vim, і він обробляв їх без проблем.
Ладья

Залежно від ваших потреб в редагуванні, ви можете просто передати його через щось на зразок sed або perl для пошуку та заміни.
El Yobo

23
Насправді це не тематично, багато програмістів використовують vim, іноді як доповнення до редактора інтерфейсу. Питання теми стосується реальної проблеми. Ми всі знаємо лише два таких хороших швейцарських армійських інструментів для виконання подібних завдань, тому, будь ласка, не ставтеся до vim як до занадто екзотичного чи поза сайту. ТАК для людей.
Славомір Ленарт

Замість того, щоб закривати його, чому б не перенести його на SuperUser або Linux / Unix або VIM?
користувач1271772

Відповіді:


72

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

cat file2 file3 >> file1

10
Чудова порада. У мене був 13-футовий (152.000.000 рядків) sql-файл, і просто за допомогою "розділити -l 1000000" потім редагувати мільйонних лінійних файлів, де я хотів, з vim працював чудово. Взяв 10 хвилин просто, щоб розділити їх. (Я намагався відкрити оригінальний файл з vim, і це спрацювало, але це було занадто повільно, щоб бути корисним.)
Claes Mogren

149

Ctrl-C зупинить завантаження файлу. Якщо файл досить малий, вам, можливо, пощастило завантажити весь вміст і просто вбити будь-які кроки після завантаження. Перевірте, що весь файл завантажено під час використання цієї підказки.

Vim може досить добре обробляти великі файли. Я щойно відредагував файл об'ємом 3,4 ГБ, видалив рядки тощо. Три речі, які слід пам’ятати:

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

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


14
Вдалося розібратися з 44-гігабайтною wikipedia xml dump in vim, користуючись цією порадою. (ctrl-c).
vancan1ty

1
Спробував прочитати кінець файлу журналу 2,5 ГБ у Windows. Відкриття в gvim призвело до помилки пам'яті, коли вона перевищила 2 ГБ пам'яті, що виділяється. Спробувавши трюк ctrl-c, він переставав завантажувати файл у пам'ять, але дозволяв бачити лише частину файлу, яку gvim змогла завантажити. Отже, чим довше я чекав, перш ніж натиснути ctrl-c, тим більше файлу я міг бачити. Навігація до кінця файлу або завантаження решти файлів було неможливим (або я не знав як). Я трохи розчарував, що vim не
вирішив

14
Не працює для мене. Я завантажую файл 3 Гб, натискаю ctrl-c, а потім з'являється вміст. Я можу редагувати прокрутку тощо, але коли я дойду до кінця завантаженої частини (скажімо, 5%), вона більше не завантажиться (я застряг із тією частиною файлу, яку завантажували спочатку до того моменту, як я натиснув ctrl-c)
Патрик

1
Підтверджено, користувач3338098. Якщо натиснути Ctrl-C, він не завантажує весь файл (як говорили інші), збереження його зберігає лише те, що ви завантажили. Ось, мабуть, тому воно переходить в режим читання лише в першу чергу. Я оновлю свою точку Readonly, щоб зазначити це.
Аарон Р.

16
Дотримуючись цих інструкцій, я змусив мене знищити величезний файл, який я щойно завантажив. Вам потрібно повністю видалити пункт 2, оскільки він в основному дає вказівки, що спричиняють втрату даних, про які ви не згадуєте до кінця публікації.
Необайт

75

Можливо, плагіни змушують задихатися. (виділення синтаксису, складки тощо)

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

vim -u "NONE" hugefile.log

Це мінімалістично, але принаймні дасть вам рухи, до яких ви звикли.

syntax off

є ще одним очевидним. Обріжте встановлення та вкажіть те, що вам потрібно. Ви дізнаєтеся, на що він здатний, і якщо вам потрібно виконати завдання за допомогою інших засобів.


3
Це все ще завантажує весь файл в оперативній пам'яті ...
Totor

@Totor Так, я б розділив файл спочатку, але це налаштування швидко дасть вам найкращу продуктивність vim, вимкнувши випадкові автокоманди. Це був мій пункт. Робочі станції з гідною пам'яттю повинні мати можливість обробляти файли, що наближаються до концерту.
Майкл

2
тож vim / vi марний, коли файл у 10 разів перевищує розмір віртуальної пам'яті?
користувач3338098

1
Я використовував цю команду, щоб відкрити файл 250 Мб за 2 секунди. Дивовижно
користувач674669

20

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

$ 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 в інтересах швидкості при завантаженні великих файлів.


8

Я намагався це зробити, в основному з файлами розміром близько 1 ГБ, коли мені потрібно було внести невеликі зміни в дамп SQL. Я в Windows, що робить це головним болем. Це серйозно важко.

Очевидне питання - "навіщо це потрібно?" Я можу вам сказати з досвіду, що потрібно спробувати це не раз, ви, мабуть, дуже хочете спробувати знайти інший спосіб.

То як же це зробити? Є кілька способів, як я це зробив. Іноді я можу отримати vim або nano, щоб відкрити файл, і я можу їх використовувати. Це дійсно сильний біль, але він працює.

Якщо це не працює (як у вашому випадку), у вас є лише кілька варіантів. Ви можете написати невелику програму, щоб внести потрібні зміни (наприклад, пошук і заміна). Ви можете використовувати програму командного рядка, яка може це зробити (можливо, це можна зробити за допомогою sed / awk / grep / тощо?)

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

Повірте мені, спробуйте знайти інший спосіб.


3
Зазвичай sed є вашим другом у таких випадках. Вашому редактору дуже не подобається думка вставити кілька символів у верхню частину файлу і придумати, як відсунути все інше вниз.
дкрецз

@le dorfier: Так. Я використовував sed, коли мені довелося здійснити пошук / заміну. Коли мені довелося видалити кілька рядків із такого файлу (кілька шалено довгих рядків), мені вдалося це зробити в vim, але, як ви можете здогадатися, переміщення між рядками (як і власне видалення) зайняло зовсім небагато часу (секунди + відповісти та перемалювати). Я не хотів би намагатися додати навіть кілька літер до одного з цих рядків.
MBCook

Точна проблема .... оператор "using" у верхній частині сценарію SQL для великої таблиці або групи файлів, яка не існує в цільовій системі. Я використовую безкоштовний сплітер файлів, щоб перебити їх, командний рядок нижче, щоб знову приєднатися.
EBarr

6

Я думаю, що шестигранні редактори досить часто обробляють величезні файли. У Windows я використовую HxD , який стверджує, що обробляє файли до 8 ЕБ (8 мільярдів гігабайт).


14
Мені було б цікаво дізнатися, як вони тестували це ...: P
Тінь

На Linux рекомендуюhexedit
elig

4

Я використовую vim 7.3.3 на Win7 x64 із плагіном LargeFile від Charles Campbell для обробки багатогігабайтних текстових файлів. Це працює дуже добре.

Я сподіваюся, що ви прийшли правильно.


Як можна відключити плагін? Наприклад, отримання всіх інших розширень, таких як підсвічування, щоб знову працювати, коли файл відкритий у Vim?
hhh

3

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




2

Я використовував вбудований редактор / переглядач FAR Commander для надзвичайно великих файлів журналів.


1

Я використовував TextPad для великих файлів журналу, у нього немає верхньої межі.


1

Єдине, що мені вдалося використати для чогось подібного, це мій улюблений шестигранний редактор Mac, 0XED. Однак це було з файлами, які я вважав великими на десятки мегабайт. Я не впевнений, як далеко це піде. Я впевнений, що він завантажує в пам'ять одразу лише частини файлу.


0

Раніше я успішно використовував підхід розділення / редагування / приєднання, коли файлів стає дуже великим. Для цього ви повинні знати про місце редагування тексту в оригінальному файлі.

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