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?
:set binarypertama kali ...
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?
:set binarypertama kali ...
Jawaban:
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
-nopsi diperlukan untuk menekan perilaku default sed untuk mencetak segala sesuatu4,5p mencetak baris 4 dan 55q 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
HUGEFILE.newsekarang akan menjadi file yang Anda edit, Anda dapat menghapus aslinya HUGEFILE.
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) .
Karena Anda tidak perlu benar-benar mengedit file:
view(baru dicoba dan waktunya). Memang, itu tidak instan, tapi berhasil.
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.
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
chmod +x mreplace.rbdulu, Anda juga bisaruby mreplace.rb ..
Untuk satu baris besar (mencetak karakter dari 1ke 99):
cut -c 1-99 filename
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
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.
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.
ini sudah tua tapi, gunakan nano, vim atau gvim