5

小さなテキスト ファイルでは問題なく動作する数千行の C++ コードがありますが、巨大なテキスト ファイル (2 GB サイズなど) ではクラッシュします。クラッシュの理由: アプリがメモリを消費します。

ディスクからメモリを割り当てることは可能ですか? ほとんどの場合、ハード ディスク領域は物理メモリよりもはるかに大きいためです。アプリ用にハードディスクからいくらかのスペースを借りて、使用後に戻すことができれば、アプリがクラッシュする可能性はほとんどありません。

ここに私のデザインの考えがあります:

  1. ファイルマッピング用の一時ファイルを作成する(CreateFileMapping、OpenFileMapping)
  2. アプリに一時ファイルからメモリを割り当てるように強制する
  3. いくつかのクリーンアップ作業を行います: CloseFileMapping と一時ファイルを削除します

私は非常に多くの既存のコードを持っているため、私の設計思想が合理的であれば、プロジェクトを再設計したくありません。

設計思想が実現可能かどうかはわかりません。誰でも私を助けることができますか?

PS: Visual C++ 2010 を使用しています。

4

3 に答える 3

4

小さなテキスト ファイルでは問題なく動作する数千行の C++ コードがありますが、巨大なテキスト ファイル (2 GB サイズなど) ではクラッシュします。クラッシュの理由: アプリがメモリを消費します。

ファイル全体を 32 ビット システム (または 2 GB の RAM を搭載した 64 ビット システム、または 64 ビット システムで実行されている 32 ビット アプリケーション) のメモリにロードしようとしています。32 ビット システムでは、2 ギガバイトのテキスト ファイルは何をしてもメモリに収まりません。これは、32 ビット アドレッシングを使用すると、ページング ファイルによってサポートされている場合でも、最大 2 ギガバイトの RAM で操作できるためです。

ソリューション。

  1. (最も簡単) ファイル全体をメモリにロードせずに、ファイルを 1 行ずつ処理します。
  2. ファイル マッピングを作成します。ファイル マッピングを使用しても、一度にファイル全体にアクセスすることはできませんが、ファイルの一部をメモリにマップすることはできます。
于 2013-06-08T11:01:57.313 に答える
0

アドレス空間が不足している場合、まずメモリを消費しているものと、それが本当に必要かどうかを調べます。より少ない使用を許可する設計変更を発見するか、ファイル内のいくつかの要素を保持するだけです-通常のファイルはメモリを再生しません。

考慮すべきもう 1 つの方法は、一部のコードを別のプロセスに移行することです。COM を使用すると、起動と保守が難しくなく、サーバーは仮想アドレス制限を回避する 64 ビット プロセスにすることができます。ディスクベースのアイデアよりも速度が遅くなることはないと思いますし、間違いなく簡単です。

そうそう、最初のことは省略しました。プロジェクトを 64 ビットに変換すると問題が解決するかもしれません。

問題が仮想空間にない場合、消費電力を 1G 未満にしたいだけであれば、唯一の友人は再設計です。その場合、私は VM を偽造しようとはしません。最初の箇条書きに書かれているとおりにしてください。

于 2013-06-09T09:55:32.690 に答える