Bekerja dengan file besar di VIM

108

Saya mencoba membuka file besar (~ 2GB) di VIM tetapi tersedak. Saya sebenarnya tidak perlu mengedit file, hanya melompat-lompat secara efisien.

Bagaimana saya bisa bekerja dengan file yang sangat besar di VIM?

hoju
sumber
1
Ini pertanyaan serupa .
GeoAvila
5
Vim seharusnya baik-baik saja selama Anda :set binarypertama kali ...
Efemient
1
Ini adalah target yang bagus untuk sistem file sekring baru! splitfs atau sesuatu seperti itu ... Aku menyukainya!
rodrigo
1
Terlambat ... ini sudah ada: sourceforge.net/projects/joinsplitfs
rodrigo
5
Anda membutuhkan pager, bukan editor, Pak! Lihat jawaban Jim di bawah.
Lester Cheung

Jawaban:

85

Saya memiliki file 12GB untuk diedit hari ini. Plugin vim LargeFile tidak bekerja untuk saya. Itu masih menggunakan semua memori saya dan kemudian mencetak pesan kesalahan :-(. Saya juga tidak dapat menggunakan hexedit, karena tidak dapat memasukkan apa pun, cukup timpa. Berikut adalah pendekatan alternatif:

Anda membagi file, mengedit bagian-bagian dan kemudian menggabungkannya kembali. Anda masih membutuhkan ruang disk dua kali lipat.

  • Grep untuk sesuatu yang mengelilingi baris yang ingin Anda edit:

    grep -n 'something' HUGEFILE | head -n 1
    
  • Ekstrak rentang file tersebut. Katakanlah baris yang ingin Anda edit berada di baris 4 dan 5. Kemudian lakukan:

    sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART
    
    • The -nopsi diperlukan untuk menekan perilaku default sed untuk mencetak segala sesuatu
    • 4,5p mencetak baris 4 dan 5
    • 5q membatalkan sed setelah jalur pemrosesan 5
  • Edit SMALLPARTmenggunakan editor favorit Anda.

  • Gabungkan file:

    (head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new 
    
    • yaitu: pilih semua baris sebelum baris yang diedit dari HUGEFILE (yang dalam hal ini adalah 3 baris teratas), gabungkan dengan baris yang diedit (dalam hal ini baris 4 dan 5) dan gunakan rangkaian baris gabungan ini untuk menggantikan setara (dalam hal ini 5 baris teratas) di HUGEFILE dan tulis semuanya ke file baru.

    HUGEFILE.newsekarang akan menjadi file yang Anda edit, Anda dapat menghapus aslinya HUGEFILE.

Florian
sumber
30

Ini telah menjadi pertanyaan yang berulang selama bertahun-tahun. (Angka terus berubah, tetapi konsepnya sama: bagaimana cara melihat atau mengedit file yang lebih besar dari memori?)

Jelas moreatau lessmerupakan pendekatan yang baik untuk sekadar membaca file --- lessbahkan menawarkan viseperti keybindings untuk menggulir dan mencari.

Sebuah Freshmeat pencarian di "file besar" menunjukkan bahwa dua editor akan sangat cocok dengan kebutuhan Anda.

Salah satunya adalah: lfhex ... editor hex file besar (yang bergantung pada Qt). Yang itu, jelas, memerlukan penggunaan GUI.

Yang lain tampaknya cocok untuk penggunaan konsol: hed ... dan mengklaim memiliki vimantarmuka -seperti (termasuk exmode?).

Saya yakin saya pernah melihat editor lain untuk Linux / UNIX yang dapat membuka halaman melalui file tanpa memuat keseluruhannya ke dalam memori. Namun, saya tidak ingat nama mereka. Saya membuat tanggapan ini sebagai entri "wiki" untuk mendorong orang lain menambahkan tautan mereka ke editor semacam itu. (Ya, saya akrab dengan cara untuk mengatasi masalah menggunakan splitdan cat; tapi saya memikirkan editor, terutama editor konsol / kutukan yang dapat membuangnya dan menghemat waktu / latensi dan overhead ruang disk yang diperlukan oleh pendekatan semacam itu) .

Jim Dennis
sumber
23

Karena Anda tidak perlu benar-benar mengedit file:

  1. view(atau vim -R) harus bekerja cukup baik pada file besar.
  2. Atau Anda bisa menggunakan moreatauless
ChssPly76
sumber
Yang Anda maksud dengan "tersedak" membutuhkan beberapa saat untuk membuka? Atau benar-benar macet? Dibutuhkan lebih dari 4 menit pada kotak Linux saya yang tidak terlalu baru untuk membuka file 2,7GB view(baru dicoba dan waktunya). Memang, itu tidak instan, tapi berhasil.
ChssPly76
Ya itu warung. Saya yakin jika saya menunggu itu akan terbuka pada akhirnya. Saya telah pergi dengan lebih sedikit karena langsung terbuka dan saya terbiasa dengan navigasi.
hoju
9

Saya menulis skrip kecil berdasarkan jawaban Florian yang menggunakan nano (editor favorit saya):

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

Gunakan seperti ini:

sh hfnano yourHugeFile 3 8

Dalam contoh itu, nano akan membuka baris 3 hingga 8, Anda dapat mengeditnya, dan ketika Anda menyimpan dan keluar, baris-baris di hugefile akan secara otomatis ditimpa dengan baris yang Anda simpan.

BT
sumber
3

Aku punya masalah yang sama, tapi itu adalah mysql sampah 300GB dan saya ingin menyingkirkan DROPdan perubahan CREATE TABLEuntuk CREATE TABLE IF NOT EXISTSjadi tidak ingin menjalankan dua doa dari sed. Saya menulis skrip Ruby cepat ini untuk menipu file dengan perubahan itu:

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

Dipanggil seperti

./mreplace.rb < foo.sql > foo_two.sql
Steeve McCauley
sumber
Sekadar catatan untuk berjalan, untuk menjalankannya sebagai exe membutuhkan chmod +x mreplace.rbdulu, Anda juga bisaruby mreplace.rb ..
Smar
Terima kasih @Steeve McCauley! Kerja bagus. Persis apa yang saya cari ketika mencari jawaban atas pertanyaan ini.
Nate Ritter
3

Untuk satu baris besar (mencetak karakter dari 1ke 99):

cut -c 1-99 filename
DmitrySandalov
sumber
2

Ini sudah terlambat tetapi jika Anda hanya ingin menavigasi file tanpa mengeditnya, Anda juga catdapat melakukan pekerjaan itu.

% cat filename | less

atau alternatif sederhana:

% less filename
chepukha
sumber
8
Perhatikan bahwa catmeningingkan file terlebih dahulu adalah tindakan bodoh yang gila-gilaan, karena itu berarti file tersebut akan sepenuhnya berada dalam memori (sehingga lessdapat mencari file tersebut) atau tidak dapat dicari sama sekali; cathanya memberikan aliran keluaran statis.
Smar
1

emacs bekerja sangat baik dengan file berukuran 100 megabyte, saya telah menggunakannya pada file log tanpa terlalu banyak masalah.

Tetapi secara umum ketika saya memiliki beberapa jenis tugas analisis, saya menemukan menulis skrip perl pilihan yang lebih baik.

Andy Ross
sumber
0

Benang tua. Namun demikian (permainan kata :)).

 $less filename

kurang berfungsi secara efisien jika Anda tidak ingin mengedit dan hanya melihat-lihat yang merupakan kasus untuk memeriksa file log yang besar.

Cari di lebih sedikit karya seperti vi

Bagian terbaiknya, ini tersedia secara default di sebagian besar distro. Jadi tidak akan menjadi masalah untuk lingkungan produksi juga.

menyelam dalam
sumber
Mencari dalam file teks 650MB dengan sedikit terbukti sebagai PITA. Menggunakan vim dengan LargeFile berfungsi seperti pesona.
MariusCC
2
@MariusCC Maka Anda belum bekerja dengan lebih dari 2 GB file, pesona Anda akan memudar dengan crash!
deepdive
-15

ini sudah tua tapi, gunakan nano, vim atau gvim

shiroxx
sumber
5
Alat-alat ini tidak melakukan apa pun untuk mengatasi masalah tersebut.
Doug Wolfgram
1
nano mengisi memori dan mati pada saya.
Trynkiewicz Mariusz