VIM'de büyük dosyalarla çalışma


108

VIM'de büyük (~ 2GB) bir dosya açmayı denedim ama tıkandı. Aslında dosyayı düzenlememe gerek yok, sadece verimli bir şekilde atlayın.

VIM'de çok büyük dosyalarla nasıl çalışabilirim?



5
:set binaryİlk sen olduğun sürece Vim iyi olmalı ...
ephemient

1
Bu, yeni bir sigorta dosya sistemi için iyi bir hedeftir! splitfs veya onun gibi bir şey ... Ben ilgileniyorum !
rodrigo

1
Çok geç ... bu zaten var: sourceforge.net/projects/joinsplitfs
rodrigo

5
Bir çağrı cihazına ihtiyacınız var, editöre değil efendim! Aşağıdaki Jim'in cevabına bakın.
Lester Cheung

Yanıtlar:


85

Bugün düzenlemem gereken 12 GB'lık bir dosyam vardı. Vim LargeFile eklentisi benim için çalışmadı. Hala tüm belleğimi kullandı ve sonra bir hata mesajı yazdırdı :-(. Hexedit'i her ikisi için de kullanamadım, çünkü hiçbir şey ekleyemez, sadece üzerine yazın. İşte alternatif bir yaklaşım:

Dosyayı böler, parçaları düzenler ve ardından yeniden birleştirirsiniz. Yine de iki kat daha fazla disk alanına ihtiyacınız var.

  • Düzenlemek istediğiniz satırı çevreleyen bir şey için grep:

    grep -n 'something' HUGEFILE | head -n 1
    
  • Dosyanın bu aralığını çıkarın. Düzenlemek istediğiniz satırların 4. ve 5. satırda olduğunu söyleyin. Ardından şunları yapın:

    sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART
    
    • -nOpsiyon şeyi yazdırmak için sed varsayılan davranışını bastırmak için gereklidir
    • 4,5p 4. ve 5. satırları yazdırır
    • 5q 5. satırı işledikten sonra iptal edilir
  • Düzenleme SMALLPARTfavori editörü kullanarak.

  • Dosyayı birleştirin:

    (head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new 
    
    • yani: HUGEFILE'dan (bu durumda ilk 3 satırdır) düzenlenen satırlardan önceki tüm satırları seçin, onu düzenlenen satırlarla birleştirin (bu durumda 4. ve 5. satırlar) ve bu birleştirilmiş satır kümesini kullanarak HUGEFILE'daki eşdeğer (bu durumda ilk 5 satır) ve hepsini yeni bir dosyaya yazın.

    HUGEFILE.newşimdi düzenlenmiş dosyanız olacak, orijinali silebilirsiniz HUGEFILE.


30

Bu, uzun yıllardır tekrar eden bir soruydu. (Sayılar değişmeye devam ediyor, ancak kavram aynı: Bellekten daha büyük dosyaları nasıl görüntüleyebilirim veya düzenleyebilirim?)

Açıkçası moreveya lesssadece dosyaları okumaya yönelik iyi yaklaşımlar --- lesshatta vikaydırma ve arama için tuş atamaları gibi teklifler bile var .

"Büyük dosyalar" üzerine yapılan bir Freshmeat araması, iki editörün özellikle ihtiyaçlarınıza uygun olacağını gösterir.

Bunlardan biri: lfhex ... büyük bir dosya onaltılık düzenleyici ( Qt'ye bağlıdır) olabilir. Açıkçası bu, bir GUI kullanmayı gerektirir.

Bir diğeri konsol kullanımına uygun görünüyor: hed ... ve benzer bir vimarayüze sahip olduğunu iddia ediyor (bir exmod dahil mi?).

Eminim, Linux / UNIX için bütünlüklerini belleğe yüklemeden dosyalar arasında sayfa ilerleyebilen başka editörler gördüm. Ancak isimlerini hatırlamıyorum. Başkalarını bu tür editörlere bağlantılarını eklemeye teşvik etmek için bu yanıtı bir "wiki" girişi yapıyorum. (Evet, splitve kullanarak sorunu çözmenin yollarına aşinayım cat; ancak editörleri düşünüyorum, özellikle bundan vazgeçebilecek ve bize bu tür yaklaşımların gerektirdiği zaman / gecikmelerden ve disk alanından tasarruf sağlayabilecek konsol / curses düzenleyicileri düşünüyorum) .


23

Dosyayı gerçekten düzenlemeniz gerekmediğinden:

  1. view(veya vim -R) büyük dosyalarda oldukça iyi çalışmalıdır.
  2. Veya kullanabilirsiniz moreveyaless

"Boğulma" derken, açılması biraz zaman alıyor mu? Yoksa gerçekten çöküyor mu? Çok yeni olmayan Linux kutumda 2.7GB dosyayı açmak view(sadece denendi ve zamanlandı) 4 dakikadan biraz fazla sürüyor . Kabul ediyorum, bu tam olarak anlık değil, ama işe yarıyor.
ChssPly76

Evet durur. Eminim ki bekleseydim sonunda açılacaktı. Daha azıyla gittim çünkü hemen açılıyor ve navigasyona alıştım.
hoju

9

Florian'ın nano kullanan cevabına dayanarak küçük bir senaryo yazdım (en sevdiğim editör):

#!/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

Bunu şu şekilde kullanın:

sh hfnano yourHugeFile 3 8

Bu örnekte, nano 3 ile 8 arasındaki satırları açacaktır, bunları düzenleyebilirsiniz ve hug dosyasındaki bu satırlar otomatik olarak kaydedilmiş satırlarınızla üzerine yazılacaktır.


3

Aynı problemi yaşadım, ama bu 300GB'lık bir mysql dökümü idi ve bundan kurtulmak DROPve değiştirmek istedim CREATE TABLE, CREATE TABLE IF NOT EXISTSbu yüzden iki çağrı çalıştırmak istemedim sed. Dosyayı bu değişikliklerle kopyalamak için bu hızlı Ruby komut dosyasını yazdım:

#!/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
}

Gibi çağrıldı

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

Sadece koşmak için not almak için, chmod +x mreplace.rbilk önce bir exe gerektirdiği gibi çalıştırmak için , şunu da yapabilirsinizruby mreplace.rb ..
Smar

Teşekkürler @Steeve McCauley! İyi iş. Bu sorunun cevabını ararken tam olarak aradığım şey.
Nate Ritter

3

Kocaman biri gömlekleri (gelen baskılar karakterler için 1için 99):

cut -c 1-99 filename

2

Zaten geç, ancak dosyayı düzenlemeden sadece dosyada gezinmek istiyorsanız cat, işi de yapabilirsiniz.

% cat filename | less

veya alternatif olarak basit:

% less filename

8
Not, catting dosyası ilk önce, ya bir dosya (bellekte tam olacağını anlamına gelir, delice aptal lessdosya talep edebilir) veya hiç aranmalıdır olamaz; catsadece statik çıktı akışı verir.
Smar

1

emacs, 100 megabaytlık dosyalarla çok iyi çalışıyor, günlük dosyalarında çok fazla sorun yaşamadan kullandım.

Ama genellikle bir tür analiz görevim olduğunda, perl betiği yazmayı daha iyi bir seçim buluyorum.


0

Eski konu. Ama yine de (kelime oyunu :)).

 $less filename

Daha azı, düzenlemek istemezseniz ve sadece etrafına bakarsanız, büyük günlük dosyalarını incelemek için etkin bir şekilde çalışır.

Vi gibi daha az çalışarak arayın

En iyi bölüm, çoğu dağıtımda varsayılan olarak mevcuttur. Bu yüzden üretim ortamı için de sorun olmayacak.


650MB metin dosyasında daha azıyla arama yapmanın bir PITA olduğu kanıtlandı. Vim'i LargeFile ile kullanmak bir cazibe gibi çalışır.
MariusCC

2
@MariusCC O halde 2 GB'den fazla dosyayla çalışmadınız, çekiciliğiniz çökecek!
deepdive

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.