Mengapa Vim tidak dapat membuka file teks 100 MB ketika saya memiliki 16 GB RAM?


67

Saya memiliki file cadangan database MySQL 100MB dan saya mengalami kesulitan untuk membukanya di Vim pada kotak Linux saya yang memiliki 16G RAM.

Vim hanya hang (setidaknya tidak dapat digunakan). Ini adalah sesuatu yang saya tidak mengerti. Saya memiliki 16 GB RAM, mengapa saya tidak dapat memuat file 100 MB dalam editor?

Apakah karena Vim? Saya pikir semua manajemen memori ditangani oleh OS.


3
Pertimbangkan untuk menggunakan editor HEX daripada editor teks untuk melihat file tersebut. Contoh hex editor dengan antarmuka vi-like adalah hexer.
Ruslan

13
Jangan lupa bahwa RAM belum seperti apa yang kita kehabisan ketika kita kehabisan memori selama beberapa dekade sekarang. Memori sekarang tervirtualisasi; itu dibagi menjadi beberapa halaman dan halaman-halaman itu dapat ditukar dengan disk. Jumlah memori yang dialokasikan dari ruang alamat suatu proses dan jumlah RAM yang dikonsumsi sangat sedikit hubungannya satu sama lain. Ketika Anda kehabisan memori, Anda sudah kehabisan ruang alamat , bukan RAM . Cara terbaik untuk memikirkannya adalah memori adalah ruang disk , setiap proses mendapatkan jumlah tertentu dari ruang itu, dan RAM adalah perangkat keras yang membuat disk Anda lebih cepat .
Eric Lippert

21
@EricLippert Kecuali disk tradisional sangat lambat (dibandingkan dengan RAM) sehingga hanya cocok untuk menyimpan halaman memori virtual yang tidak digunakan secara aktif. Jika suatu proses hang (atau setidaknya tidak dapat digunakan, seperti yang dikatakan OP) karena swap meronta-ronta, itu tepatnya karena RAM adalah apa yang telah habis.
depquid

6
@EricLippert kehabisan ruang alamat hanya relevan pada sistem 32 bit saat ini. Saya ragu bahwa pengguna dengan 16G RAM masih akan menggunakan kernel PAE 32 bit, bukan 64 bit yang normal.
Ruslan

3
@depquid: Itu poin bagus; dorongan komentar saya adalah bahwa OP tampaknya memiliki keyakinan bahwa "Saya memuat 100MB barang, saya memiliki 16000MB RAM, jadi 100MB dari 16000MB RAM saya dikonsumsi". Sistem kepercayaan ini sudah ketinggalan zaman.
Eric Lippert

Jawaban:


69

Vim terkadang bermasalah dengan file yang memiliki garis panjang luar biasa. Ini adalah editor teks, jadi itu dirancang untuk file teks, dengan panjang garis yang biasanya paling banyak beberapa ratus karakter.

File database mungkin tidak mengandung banyak karakter baris baru, jadi bisa jadi hanya satu baris panjang 100 Mb. Vim tidak akan senang dengan itu, dan meskipun mungkin akan berhasil, mungkin butuh waktu yang cukup lama untuk memuat file.

Saya sudah pasti membuka file teks yang jauh lebih besar dari 100 Mb dengan Vim. File bahkan tidak perlu masuk ke memori sekaligus (karena Vim dapat menukar perubahan ke disk sesuai kebutuhan).


1
Saya juga memperhatikan garis yang sangat panjang, mencoba dengan file lain tanpa garis yang sangat panjang, melihat peningkatan besar. Terima kasih
Tanyakan dan Pelajari

11
@AskandLearn Tergantung pada jenis file, Anda dapat melihat peningkatan kinerja jika Anda set synmaxcol=120(atau nomor lain yang sesuai). Saya telah memperhatikan percepatan besar dari ini di masa lalu.
sapi

Adakah yang tahu kalau garpu neovim baru-baru ini akan menangani garis yang lebih panjang dengan lebih baik? Saya kira itu bukan masalah yang umum ...
Hemmer

@GregHewgill itu benar, saya juga mengamati itu, tetapi bagaimana Anda tahu itu?
Rahul Patil

56

Dalam pengalaman saya Vim tersedak bukan pada file besar , tetapi pada garis panjang . Gunakan perintah ini untuk mysqldumpmenggunakan baris yang lebih pendek dengan mengorbankan file yang lebih besar :

$ mysqldump --complete-insert -u -p

Selain itu, Anda dapat membuka Vim dan memintanya untuk tidak mem-parsing .vimrcfile Anda atau memuat plugin apa pun dengan perintah ini:

$ vim -u NONE output.sql

Memuat Vim dengan cara ini akan menggunakan lebih sedikit memori dan tidak memerlukan Vim untuk mem-parsing seluruh file seperti halnya banyak plugin.


15

"muat VIM tanpa .vimrc dan plugins (bersihkan VIM) misalnya untuk file BESAR

  gvim -u NONE -U NONE -N largefile.sql

13

Coba gunakan lessalih-alih vimjika Anda ingin melihat file besar secara langsung. Vim mencoba melakukan banyak hal yang berbeda ketika pertama kali memuat - memindai file (berpotensi dalam beberapa lintasan) untuk mencoba menentukan sintaks apa yang akan digunakan, dan melakukan penyorotan sintaks, dan mencari modelines di bagian atas dan bawah file. Kemudian saat Anda mengedit file, vim menyimpan swapfiles dan menjaga pohon dibatalkan (membatalkan sejarah di vim bercabang, tidak linier seperti di setiap (?) Editor lain), dan terus-menerus mengevaluasi kembali penyorotan sintaksis saat teks berubah, dll.

Tak satu pun dari itu yang tentu saja merupakan alasan mengapa harus begitu tidak dapat digunakan dengan file raksasa, tapi itu lebih merupakan penjelasan dari beberapa alasan mengapa itu.


Lihat jawaban saya untuk cara mencegah VIM melakukan operasi berat seperti penguraian file.
dotancohen

Yup, sintaks yang menyoroti hal-hal seperti XML dan SQL bisa menjadi sangat lambat pada file yang lebih besar.
Marcin

9

Vim tidak hanya memuat file apa adanya ke dalam memori. Itu mengubahnya menjadi struktur internal (baris, kata, dll), melakukan penyorotan sintaksis menggunakan bahasa skrip internal, dan sebagainya; yang semuanya menghabiskan memori (lebih dari satu byte untuk sebuah karakter) dan waktu CPU.


Mengonsumsi memori bahkan bukan masalah. Waktu CPU digunakan (dan pembekuan yang terlihat saat Anda menunggu), adalah.
Lightness Races dengan Monica

Waktu CPU itu sebagian besar diambil oleh skrip penyorotan sintaksis.
demonkoryu

Ya saya setuju. Saya hanya mengatakan bahwa penggunaan memori sangat tidak mungkin (a) menjadi masalah, atau (b) menyebabkan penundaan yang lama, bertentangan dengan apa yang jawaban Anda katakan.
Lightness Races dengan Monica

Anda benar, saya sudah memperbarui jawaban saya.
demonkoryu


4

Semoga masalah Anda lebih berkaitan dengan kebutuhan VIM untuk file sementara (seperti swap) lebih dari RAM.

Dalam banyak kasus, file sementara yang dibuat oleh VIM berada di direktori yang sama dengan file yang Anda buka. Jika ini masalahnya, Anda dapat memverifikasi dengan memeriksa ruang disk yang tersedia di direktori saat ini.

Untungnya, ada dokumentasi yang bagus tentang bagaimana Anda dapat menentukan lokasi yang berbeda untuk pengindeksan / pertukaran file VIM:

Anda juga dapat menonaktifkan file swap


1

Saya kadang-kadang membuka cadangan database besar dalam format teks .sql. File yang sangat besar, atau file dengan garis yang sangat panjang seringkali kadang-kadang tampaknya membutuhkan waktu lama untuk dibuka dalam vim. Ini mungkin terkait dengan pemrosesan sintaksis dan penyorotan warna, seperti yang disebutkan dalam jawaban oleh @zzapper dan @demonkoryu.

Solusi cepat mungkin dengan menekan "control-G" selama memuat file untuk membatalkan sintaks yang menyoroti pra-pemrosesan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.