Робота з величезними файлами в VIM


108

Я спробував відкрити величезний (~ 2 Гб) файл у VIM, але він захлинувся. Мені насправді не потрібно редагувати файл, просто досить ефективно стрибати.

Як я можу розпочати роботу з дуже великими файлами в VIM?



5
Vim повинен бути добре, якщо ви :set binaryвперше ...
ефемія

1
Це хороша ціль для нової файлової системи запобіжників! спліфи або щось подібне ... Я в це!
rodrigo

1
Занадто пізно ... це вже існує: sourceforge.net/projects/joinsplitfs
rodrigo

5
Вам потрібен пейджер, а не редактор! Дивіться відповідь Джима нижче.
Лестер Чеун

Відповіді:


85

Я мав файл 12 Гб для редагування сьогодні. Плагін vim LargeFile не працював для мене. Він все-таки використав усю мою пам'ять, а потім надрукував повідомлення про помилку :-(. Я не міг використовувати hexedit для будь-якого, оскільки він не може нічого вставити, просто перезаписати. Ось альтернативний підхід:

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

  • Майте на увазі щось навколо рядка, який ви хочете відредагувати:

    grep -n 'something' HUGEFILE | head -n 1
    
  • Витягніть цей діапазон файлу. Скажіть, що рядки, які ви хочете відредагувати, знаходяться у рядках 4 та 5. Потім виконайте такі дії:

    sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART
    
    • Цей -nпараметр необхідний для придушення поведінки sed за замовчуванням, щоб надрукувати все
    • 4,5p друкує рядки 4 і 5
    • 5q перериває sed після обробки 5 лінії
  • Редагуйте SMALLPARTза допомогою улюбленого редактора.

  • Об'єднайте файл:

    (head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new 
    
    • тобто: оберіть усі рядки перед відредагованими рядками з HUGEFILE (що в даному випадку є верхніми 3 рядками), поєднайте його з відредагованими рядками (у цьому випадку рядки 4 та 5) та використовуйте цей комбінований набір рядків для заміни еквівалент (у даному випадку - топ-5 рядків) у HUGEFILE та запишіть його у новий файл.

    HUGEFILE.newтепер буде ваш відредагований файл, ви можете видалити оригінал HUGEFILE.


30

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

Очевидно, moreчи lessце хороші підходи до простого читання файлів --- lessнавіть viтаких пропозицій, як клавіші для прокрутки та пошуку.

Freshmeat пошук на «великі файли» передбачає , що два редактора будуть особливо підходять для ваших потреб.

Одне було б: lfhex ... великий шестигранний редактор файлів (що залежить від Qt). Це, очевидно, тягне за собою використання GUI.

Інший, здавалося б, підходить для використання консолі: hed ... і він стверджує, що має vimподібний інтерфейс (включаючи exрежим?).

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


23

Оскільки вам не потрібно фактично редагувати файл:

  1. view(або vim -R) має працювати досить добре на великих файлах.
  2. Або ви можете використовувати moreабоless

Під "задухами" ви маєте на увазі пройти час, щоб відкрити? Або насправді збої? На моєму не надто недавньому вікні Linux потрібне трохи більше 4 хвилин, щоб відкрити 2,7 ГБ файл view(щойно перевірений і приурочений). Зрозуміло, це не зовсім миттєво, але це працює.
ChssPly76

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

9

Я написав невеликий сценарій на основі відповіді Флоріана, який використовує нано (мій улюблений редактор):

#!/bin/sh

if [ "$#" -ne 3 ]; then
  echo "Usage: $0 hugeFilePath startLine endLine" >&2
  exit 1
fi

sed -n -e $2','$3'p' -e $3'q' $1 > hfnano_temporary_file
nano hfnano_temporary_file
(head -n `expr $2 - 1` $1; cat hfnano_temporary_file; sed -e '1,'$3'd' $1) > hfnano_temporary_file2
cat hfnano_temporary_file2 > $1
rm hfnano_temporary_file hfnano_temporary_file2

Використовуйте його так:

sh hfnano yourHugeFile 3 8

У цьому прикладі nano відкриє рядки 3 до 8, ви можете їх редагувати, і коли ви збережете та вийдете, ці рядки у величезному файлі автоматично будуть перезаписані збереженими рядками.


3

У мене була така ж проблема, але це було MySQL дамп 300GB , і я хотів , щоб позбутися від DROPі зміни CREATE TABLEдо CREATE TABLE IF NOT EXISTSтак не хотів запускати два інвокаціі sed. Я написав цей швидкий сценарій Ruby, щоб обробляти файл тими змінами:

#!/usr/bin/env ruby

matchers={
    %q/^CREATE TABLE `foo`/ => %q/CREATE TABLE IF NOT EXISTS `foo`/,
    %q/^DROP TABLE IF EXISTS `foo`;.*$/ => "-- DROP TABLE IF EXISTS `foo`;"
}

matchers.each_pair { |m,r|
    STDERR.puts "%s: %s" % [ m, r ]
}

STDIN.each { |line|
    #STDERR.puts "line=#{line}"
    line.chomp!
    unless matchers.length == 0
        matchers.each_pair { |m,r|
            re=/#{m}/
            next if line[re].nil?
            line.sub!(re,r)
            STDERR.puts "Matched: #{m} -> #{r}"
            matchers.delete(m)
            break
        }
    end
    puts line
}

Закликають як

./mreplace.rb < foo.sql > foo_two.sql

Просто зауважте, що для запуску, щоб запустити його як exe потрібно chmod +x mreplace.rbспочатку, ви також можете простоruby mreplace.rb ..
Smar

Дякую @Steeve McCauley! Хороша робота. Саме те, що я шукав під час пошуку відповіді на це питання.
Нейт Ріттер


2

Уже пізно, але якщо ви просто хочете переміщатися по файлу, не редагуючи його, теж catможете виконати роботу.

% cat filename | less

або ж просто:

% less filename

8
Зауважте, що catперше відтворення файлу є шалено дурним, оскільки це означає, що файл буде повністю запам’ятовуватися (тому lessможна шукати файл), або його взагалі не можна шукати; catпросто дає статичний вихідний потік.
Смар

1

emacs дуже добре працює з файлами в 100 мегабайт, я використовував їх у лог-файлах без особливих проблем.

Але загалом, коли у мене є якесь завдання аналізу, я вважаю, що написання сценарію Perl є кращим вибором.


0

Стара нитка. Але все-таки (каламбур :)).

 $less filename

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

Шукайте в таких роботах, як vi

Найкраще, вона доступна за замовчуванням у більшості дистрибутивів. Тож не буде проблемою і виробниче середовище.


Пошук у текстовому файлі 650 Мб із меншою мірою виявився PITA. Використання vim з LargeFile працює як шарм.
MariusCC

2
@MariusCC Тоді ви не працювали з файлами більше 2 ГБ, ваш шарм зникне з крахом!
деддів

-15

це старе, але використовуйте nano, vim або gvim


5
Ці засоби нічого не роблять для вирішення проблеми.
Doug Wolfgram

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