Bagaimana cara mengedit file teks multi-gigabyte? Vim tidak berfungsi = ([tutup]

112

Apakah ada editor yang dapat mengedit file teks multi-gigabyte, mungkin hanya dengan memuat sebagian kecil ke dalam memori sekaligus? Sepertinya Vim tidak bisa mengatasinya = (

Philip Brocoum
sumber
Saya telah memuat file akuisisi data yang sangat besar di vim, dan itu menanganinya tanpa masalah.
Benteng
Bergantung pada kebutuhan pengeditan Anda, Anda mungkin dapat menyalurkannya melalui sesuatu seperti sed atau perl untuk melakukan pencarian dan penggantian.
El Yobo
23
Sebenarnya tidak off-topic, banyak programmer yang menggunakan vim, terkadang sebagai pelengkap UI editor. Pertanyaan topiknya adalah tentang masalah yang sebenarnya. Kita semua tahu hanya dua alat tentara swiss yang bagus untuk tugas semacam ini, jadi tolong jangan perlakukan vim terlalu eksotis atau di luar lokasi. SO untuk orang-orang.
Sławomir Lenart
Alih-alih menutupnya, mengapa tidak memindahkannya ke SuperUser atau Linux / Unix, atau VIM?
pengguna1271772

Jawaban:

72

Jika Anda berada di * nix (dan dengan asumsi Anda harus memodifikasi hanya bagian file (dan jarang)), Anda dapat membagi file (menggunakan splitperintah), mengedit mereka secara individu (menggunakan awk, sed, atau yang serupa) dan menggabungkannya setelah Anda selesai.

cat file2 file3 >> file1
Al pacino
sumber
10
Tip yang bagus. Saya memiliki file sql 13GB (152.000.000 baris), dan hanya menggunakan "split -l 1000000" kemudian mengedit satu juta file baris yang saya inginkan dengan vim bekerja dengan baik. Butuh 10 menit hanya untuk membaginya. (Saya mencoba membuka file asli dengan vim dan berhasil, tetapi terlalu lambat untuk dapat digunakan.)
Claes Mogren
149

Ctrl-C akan menghentikan pemuatan file. Jika filenya cukup kecil, Anda mungkin beruntung telah memuat semua konten dan mematikan semua langkah pemuatan pos. Verifikasi bahwa seluruh file telah dimuat saat menggunakan tip ini.

Vim dapat menangani file besar dengan cukup baik. Saya baru saja mengedit file 3.4GB, menghapus baris, dll. Tiga hal yang perlu diingat:

  1. Tekan Ctrl-C: Vim mencoba membaca seluruh file pada awalnya, untuk melakukan hal-hal seperti penyorotan sintaks dan jumlah baris dalam file, dll. Ctrl-C akan membatalkan pencacahan ini (dan penyorotan sintaks), dan itu hanya akan memuat apa perlu ditampilkan di layar Anda.
  2. Readonly: Vim kemungkinan akan memulai read-only ketika file terlalu besar untuk dibuat. salinan file untuk melakukan pengeditan pada. Saya harus w! untuk menyimpan file, dan waktu itulah yang paling lama.
  3. Pergi ke baris: Mengetik :115355akan membawa Anda langsung ke baris 115355, yang jauh lebih cepat terjadi pada file-file besar itu. Vim tampaknya mulai memindai dari awal setiap kali memuat buffer baris, dan menahan Ctrl-F untuk memindai melalui file tampaknya menjadi sangat lambat di dekat bagian akhirnya.

Catatan - Jika instance Vim Anda hanya-baca karena Anda menekan Ctrl-C, mungkin Vim tidak memuat seluruh file ke dalam buffer. Jika itu terjadi, menyimpannya hanya akan menyimpan apa yang ada di buffer, bukan seluruh file . Anda dapat dengan cepat memeriksa dengan Gsampai lompat ke akhir untuk memastikan semua baris di file Anda ada di sana.

Aaron R.
sumber
14
Mampu menangani 44 gigabyte wikipedia xml dump di vim menggunakan saran ini. (ctrl-c).
vancan1ty
1
Mencoba membaca akhir dari file log 2.5GB di windows. Pembukaan di gvim mengakibatkan kesalahan memori saat melebihi alokasi memori 2GB. Saat mencoba trik ctrl-c, itu berhenti memuat file ke memori tetapi hanya diizinkan untuk melihat bagian dari file yang dapat dimuat gvim. Jadi semakin lama saya menunggu sebelum menekan ctrl-c, semakin banyak file yang bisa saya lihat. Menavigasi ke akhir file atau memuat sisa file tidak mungkin (atau saya tidak tahu caranya). Agak mengecewakan bahwa vim tidak sesuai dengan tugasnya: (Pada akhirnya saya menggunakan beberapa alat khusus gratis untuk membagi file menjadi file 100MB.
slawek
14
Tidak berhasil untuk saya. Saya memuat file 3GB, tekan ctrl-c dan kemudian isinya muncul. Saya dapat mengedit gulir dll tetapi ketika saya sampai di akhir bagian yang dimuat (katakanlah 5%) itu tidak dapat dimuat lagi (Saya terjebak dengan bagian file yang dimuat awalnya sampai saya menekan ctrl-c)
Patryk
1
Dikonfirmasi, pengguna3338098. Jika Anda menekan Ctrl-C dan tidak memuat seluruh file (seperti yang dibicarakan orang lain), menyimpannya hanya menyimpan apa yang telah Anda muat. Mungkin itulah mengapa ini menjadi hanya baca di tempat pertama. Saya akan memperbarui poin Readonly saya untuk mencatat itu.
Aaron R.
16
Mengikuti petunjuk ini menyebabkan saya menghancurkan file besar yang baru saja saya unduh. Anda harus sepenuhnya menghapus poin 2 karena pada dasarnya memberikan instruksi yang menyebabkan kehilangan data, yang tidak Anda sebutkan hingga akhir posting.
Neobyte
75

Mungkin plugin yang menyebabkannya tersedak. (penyorotan sintaks, lipatan, dll.)

Anda dapat menjalankan vim tanpa plugin.

vim -u "NONE" hugefile.log

Ini minimalis tetapi setidaknya akan memberi Anda gerakan vi yang biasa Anda lakukan.

syntax off

adalah satu lagi yang jelas. Pangkas penginstalan Anda dan dapatkan sumber yang Anda butuhkan. Anda akan mengetahui kemampuannya dan apakah Anda perlu menyelesaikan tugas melalui cara lain.

michael
sumber
3
Ini masih memuat seluruh file dalam RAM ...
Totor
@Totor ya saya akan membagi file terlebih dahulu tetapi pengaturan itu akan segera memberi Anda kinerja vim terbaik dengan mematikan perintah otomatis acak. Itu maksud saya. Workstation dengan memori yang layak seharusnya dapat menangani file yang mendekati pertunjukan.
michael
2
jadi vim / vi tidak berguna ketika ukuran file 10 kali lebih besar dari memori virtual?
user3338098
1
Saya menggunakan perintah ini untuk membuka file 250MB dalam waktu kurang dari 2 detik. Luar biasa
pengguna674669
20

Sedikit perbaikan pada jawaban yang diberikan oleh @Al pachio dengan solusi split + vim Anda dapat membaca file dengan glob, secara efektif menggunakan potongan file sebagai buffer misalnya

$ 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
Amos Folarin
sumber
15

Anda mungkin ingin memeriksa plugin VIM ini yang menonaktifkan fitur vim tertentu demi kecepatan saat memuat file besar.

RedBlueThing
sumber
8

Saya sudah mencoba melakukan itu, kebanyakan dengan file sekitar 1 GB ketika saya perlu membuat sedikit perubahan pada SQL dump. Saya menggunakan Windows, yang membuatnya sangat sakit. Sangat sulit.

Pertanyaan yang jelas adalah "mengapa Anda perlu?" Saya dapat memberitahu Anda dari pengalaman harus mencoba ini lebih dari sekali, Anda mungkin benar - benar ingin mencoba mencari cara lain.

Jadi, bagaimana Anda melakukannya? Ada beberapa cara saya melakukannya. Terkadang saya bisa mendapatkan vim atau nano untuk membuka file, dan saya bisa menggunakannya. Itu rasa sakit yang sangat berat, tetapi berhasil.

Ketika itu tidak berhasil (seperti dalam kasus Anda), Anda hanya memiliki beberapa opsi. Anda dapat menulis program kecil untuk membuat perubahan yang Anda butuhkan (misalnya, mencari & mengganti). Anda dapat menggunakan program baris perintah yang mungkin dapat melakukannya (mungkin dapat dilakukan dengan sed / awk / grep / etc?)

Jika itu tidak berfungsi, Anda selalu dapat membagi file menjadi beberapa bagian (seperti split menjadi pilihan yang jelas, tetapi Anda dapat menggunakan head / tail untuk mendapatkan bagian yang Anda inginkan) dan kemudian mengedit bagian yang membutuhkannya, dan bergabung kembali nanti.

Percayalah, coba cari cara lain.

MBCook
sumber
3
Biasanya sed adalah temanmu dalam kasus seperti ini. Editor Anda benar-benar tidak suka memikirkan untuk memasukkan beberapa karakter di bagian atas file dan mencari tahu cara menekan yang lainnya.
dkretz
@le dorfier: Ya. Saya menggunakan sed ketika saya harus melakukan pencarian / penggantian. Ketika saya harus menghapus beberapa baris dari file seperti itu (beberapa baris yang sangat panjang ) saya berhasil melakukannya di vim, tetapi seperti yang dapat Anda tebak bergerak antar baris (serta penghapusan yang sebenarnya) membutuhkan waktu yang cukup lama (detik + untuk menanggapi dan menggambar ulang). Saya tidak ingin mencoba menambahkan bahkan beberapa huruf ke salah satu baris itu.
MBCook
Masalah yang sama persis .... pernyataan "menggunakan" di bagian atas skrip SQL untuk tabel besar, atau grup file yang tidak ada di sistem target. Saya menggunakan Free File Splitter untuk menghancurkannya, baris perintah di bawah ini untuk bergabung kembali.
EBarr
6

Saya pikir itu cukup umum untuk editor hex untuk menangani file besar. Di Windows, saya menggunakan HxD , yang mengklaim dapat menangani file hingga 8 EB (8 miliar gigabyte).

John Y
sumber
14
Saya tertarik untuk mengetahui bagaimana mereka mengujinya ...: P
Shadow
Di linux saya sarankanhexedit
kelayakan
4

Saya menggunakan vim 7.3.3 pada Win7 x64 dengan plugin LargeFile oleh Charles Campbell untuk menangani file teks biasa multi-gigabyte. Ini bekerja dengan sangat baik.

Saya harap Anda datang dengan benar.

AndrewJacksonZA
sumber
Bagaimana Anda bisa menonaktifkan plugin? Misalnya mendapatkan semua ekstensi lain seperti penyorotan untuk bekerja kembali saat file dibuka di Vim?
hhh
3

Wow, tidak pernah berhasil membuat vim tersedak, bahkan dengan satu atau dua GB. Saya pernah mendengar bahwa UltraEdit (di Windows) dan BBEdit (di Mac) bahkan lebih cocok untuk file yang lebih besar, tetapi saya tidak memiliki pengalaman pribadi.

Alex Martelli
sumber
2

Di masa lalu saya membuka hingga file 3 pertunjukan dengan alat ini http://csved.sjfrancke.nl/

Zaffiro
sumber
2

Saya telah menggunakan editor / viewer bawaan FAR Commander untuk file log super besar.

azheglov.dll
sumber
1

Saya telah menggunakan TextPad untuk file log besar yang tidak memiliki batas atas.

bstoney
sumber
1

Satu-satunya hal yang dapat saya gunakan untuk sesuatu seperti itu adalah editor hex Mac favorit saya, 0XED. Namun, itu dengan file yang saya anggap besar, yaitu puluhan megabyte. Saya tidak yakin seberapa jauh itu akan berjalan. Saya cukup yakin itu hanya memuat bagian file ke dalam memori sekaligus.

AriX
sumber
0

Di masa lalu saya telah berhasil menggunakan pendekatan split / edit / join ketika file menjadi sangat besar. Agar ini bekerja, Anda harus tahu tentang di mana teks yang akan diedit, di file aslinya.

Cheeso
sumber