16 GBのRAMがあるときにVimで100 MBのテキストファイルを開けないのはなぜですか?


67

100MBのMySQLデータベースバックアップファイルがあり、16GのRAMを搭載したLinuxボックスのVimで開くことができません。

Vimはハングします(少なくとも使用できません)。これは私が理解していないことです。16 GBのRAMがありますが、エディターで100 MBのファイルを読み込めないのはなぜですか?

Vimが原因ですか?すべてのメモリ管理はOSによって処理されると思いました。


3
このようなファイルを表示するには、テキストエディターの代わりにHEXエディターの使用を検討してください。viのようなインターフェースを備えた16進エディターの例はになりますhexer
ルスラン14年

13
RAMが何十年もメモリを使い果たしたときに使い果たしたものではなかったことを忘れないでください。メモリが仮想化されました。ページに分割され、それらのページはディスクにスワップできます。プロセスのアドレス空間から割り当てられるメモリの量と消費されるRAMの量は、互いにほとんど関係ありません。メモリが不足すると、RAMではなくアドレス空間が不足します。それを考える最良の方法は、メモリがディスクスペースであり、各プロセスが特定の固定量のスペースを取得することであり、RAMはディスクを高速化するハードウェアです
エリックリッパー14年

21
@EricLippert従来のディスクは(RAMに比べて)非常に遅いため、アクティブに使用されていない仮想メモリページの保存にのみ適しています。 スワップスラッシングのためにプロセスがハングする(または少なくともOPが指定したように使用できない)場合、RAMが不足しているためです。
14年

6
アドレス空間が不足している@EricLippertは、今日の32ビットシステムでのみ関連します。16G RAMを使用しているユーザーが、通常の64ビットのカーネルではなく、32ビットのPAEカーネルを引き続き使用することを疑います。
ルスラン14年

3
@depquid:それは良い点です。私のコメントの趣旨は、OPが「100MBのデータをロードし、16000MBのRAMを持っているので、1MBのRAMの100MBが消費された」という信念を持っているようだということです。この信念体系は時代遅れです。
エリックリッパー14年

回答:


69

Vimは、異常に長い行を持つファイルで問題を起こすことがあります。テキストエディタであるため、テキストファイル用に設計されており、行の長さは通常最大で数百文字です。

データベースファイルには多くの改行文字が含まれていない可能性があるため、1つの100 Mbの長い行である可能性があります。Vimはこれに満足せず、おそらく動作しますが、ファイルのロードに非常に長い時間がかかる場合があります。

私は確かにVimで100 Mbよりもはるかに大きいテキストファイルを開いてます。ファイルは一度にメモリに収まる必要さえありません(Vimは必要に応じて変更をディスクにスワップできるため)。


1
また、非常に長い行に気づき、非常に長い行なしで別のファイルを試したところ、大きな改善が見られました。ありがとう
質問して、14

11
@AskandLearnファイルの種類によっては、パフォーマンスが向上する場合がありますset synmaxcol=120(または他の適切な数値)。過去にこれからの大幅な高速化に気づきました。
サピ14年

最近のneovimフォークが長い行をより良く処理するかどうかは誰にもわかりますか?私はそれが特に一般的な問題ではないと思います...
ヘメル

@GregHewgillそれは本当です、私もそれを観察しましたが、どうやってそれを知ったのですか?
ラーフルパティル14

56

私の経験では、Vimは大きなファイルではなく、長い行でチョークします。このコマンドをmysqldump使用して、大きなファイルを犠牲にして短い行を使用します

$ mysqldump --complete-insert -u -p

さらに、Vimを開い.vimrcて、次のコマンドを使用してファイルを解析したり、プラグインをロードしないように要求したりできます。

$ vim -u NONE output.sql

この方法でVimをロードすると、使用するメモリが少なくなり、多くのプラグインが行うようにVimがファイル全体を解析する必要がなくなります。


15

".vimrcおよびプラグインなしのVIMをロード(クリーンVIM)巨大なファイルなど

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

13

大きなファイルを直接表示する場合lessvim、代わりに使用してみてください。Vimは、最初の読み込み時にさまざまな処理を実行します-使用する構文を決定するために(場合によっては複数のパスで)ファイルをスキャンし、構文の強調表示を実行し、ファイルの上下でモードラインを検索します。次に、ファイルを編集するときに、vimはスワップファイルを保存し、元に戻すツリーを保持します(vimの元に戻す履歴は分岐し、他のすべての(?)エディターのように線形ではありません)。

巨大なファイルでは使用できない理由の正当性は必ずしもありませんが、それが理由のいくつかの説明に過ぎません。


VIMがファイル解析などの重い操作を実行するのを防ぐ方法については、私の回答をご覧ください。
dotancohen

うん、XMLやSQLなどの構文の強調表示は、大きなファイルでは非常に遅くなる可能性があります。
マーチン14年

9

Vimはファイルをそのままメモリにロードするだけではありません。内部構造(行、単語など)に変換し、内部スクリプト言語を使用して構文の強調表示を実行します。これらはすべてメモリ(文字の1バイト以上の全体)とCPU時間を消費します。


メモリの消費も問題ではありません。使用されているCPU時間(および待機中に目に見えるフリーズ)があります。
モニカと軽さのレース14

そのCPU時間は、主に構文強調スクリプトによって占められます。
demonkoryu 14

はい私は同意する。メモリ使用量が(a)問題になる可能性が非常に低い、または(b)あなたの答えに反して長い遅延を引き起こす可能性は非常に低いと言っています。
モニカとの軽さのレース14

あなたは正しい、私はそれに応じて私の答えを更新しました。
demonkoryu 14


4

うまくいけば、問題はRAMよりも一時ファイル(スワップなど)に必要なVIMに関係することです。

多くの場合、VIMによって作成された一時ファイルは、開いているファイルと同じディレクトリにあります。これが当てはまる場合は、現在のディレクトリの使用可能なディスク領域を確認して確認できます。

幸いなことに、VIMのインデックス作成/スワップファイル用に別の場所を指定する方法に関する優れたドキュメントがあります。

スワップファイルを無効にすることもできます


1

.sqlテキスト形式で大規模なデータベースバックアップを開くことがあります。非常に大きなファイル、または非常に長い行を持つファイルは、しばしばvimで開くのに時間がかかるようです。これは、@ zzapperと@demonkoryuの回答で述べられているように、構文処理と色の強調表示に関連している可能性があります。

簡単な回避策は、ファイルの読み込み中に「control-G」を押して、前処理を強調する構文をキャンセルすることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.