免責事項:私はこの質問の冗長さをお詫びします(私はそれは面白い問題だと思いますが)もっと簡潔に言えばアクセス> 2,3,4GB 64bit(または32bit)Windows上の32bitファイルファイル
私は明らかに/LARGEADDRESSAWARE
からVirtualAllocEx
AWEに至るまで、64ビット版のWindows 7上の32ビットプロセスでマルチGBのファイルへのアクセスの問題を解決するには無数の方法のような研究の時間を行っています。私は、Windows(CreateFileMapping、MapViewOfFileなど)でマルチビューメモリマップシステムを作成するのはやや快適ですが、この問題に対するより洗練された解決策が存在するという感情から逃れることはできません。また、私はBoostのプロセス間およびiostreamのテンプレートをよく知っていますが、軽量であるように見えますが、Windows API呼び出しのみを利用してシステムを作成するのに似たような努力が必要です(私は、 Windows API呼び出しを使用して半実装されたマップされたアーキテクチャ)。
大きなデータセットを処理しようとしています。このプログラムはあらかじめコンパイルされた32ビットライブラリに依存しているため、システムが64ビットで64ビットOSであっても、プログラム自体も32ビットプロセスで動作しています。私は、これの周りにラッパーライブラリを追加する方法があることを知っていますが、それがより大きいコードベースの一部であることを見ても、それは確かに少しの作業です。私は/LARGEADDRESSAWARE
(私のカーネルスペースを減らすことを犠牲にして)を許すようにバイナリヘッダーを設定しました。それは、プロセスごとに約2-3GBのアドレス可能なメモリを与えたり、与えたり(ヒープフラグメンテーションなどに依存して) 。
問題は次のとおりです。データセットは4 + GBであり、ファイル全体に基本的にランダムアクセスが必要なDSPアルゴリズムが実行されています。ファイルから生成されたオブジェクトへのポインタはC#で処理されますが、ファイル自体はC++(これはP/Invoked)でメモリにロードされます(この部分的メモリマップシステムで)。したがって、私はアクセスする必要があるファイルの部分にアクセスするためにウィンドウを調整するだけでは不都合ではないと思います。基本的には、ファイル全体を1つのポインタに抽象化したいので、メソッドから呼び出すことができますファイル内のほぼどこにでもデータにアクセスできます。
ほとんどのメモリマップされたアーキテクチャは、特異プロセスを複数のプロセスに分割することに依存しています。たとえば、3GBのプロセスで6GBのファイルにアクセスします。私はこれらの異なるウィンドウ/プロセス間でデータを引き出し、再結合するためにかなりの量のロジックを追加する必要があります。 VirtualAllocEx
は明らかに仮想アドレス空間を増やす方法を提供しますが、これが最善の方法であるかどうかはまだ完全にはわかりません。
しかし、このプログラムを64ビットシステム上の単なる64ビットプロセスと同じように「簡単に」機能させたいとします。私はスラッシングを気にしないと仮定し、システム上の大きなファイルを操作できるようにしたいとします.500 MBしか一度に物理RAMにロードされない場合でも同じです。手動でいくらかばかげた手動メモリシステムを書かなくても、この機能を得る方法はありますか?それとも、私はそうやってSOとインターネットを使って見つけたより良い方法がありますか?
これは二次質問に役立ちます。このプロセスで使用される物理RAMの量を制限する方法はありますか?たとえば、プロセスを物理RAMに一度に500 MBしかロードしないように制限したいのであれば(マルチGBファイルをディスク上に保ったままで)
長い質問には申し訳ありませんが、SOとネットで見つかった多くの質問(部分的な回答のみ)が表示されているようです。私は、これが決定的な答え(または少なくともいくつかの長所/短所)を洗い流すことができる領域になることを望んでおり、プロセスで貴重なものをすべて学ぶことができます!
tl;しかし、外部ライブラリを使用したい場合:Qtは(32ビットプラットフォームで)メモリマップされていないが、 "ビッグファイル"クロスプラットフォームを処理できます。しかし、それは同等の性能に達する可能性のある内部IOキャッシュを使用しますか? – leemes
コメントをいただきありがとうございます(たとえtl; drが> _ ;;;)と言っても大したことはありません)!私は内部IOキャッシュを使用する方法を検討しましたが、これはかなりの複雑さを導入するように思えます。これは避けようとしているものです。また、Qtなどのライブラリを追加することを避けたいと思います(Boostはすでに統合されています)。 –
RAMを制限すると、Windowsジョブオブジェクトを使用して物理RAMを制限するワーキングセットを制限できます。残念ながら、これはスワップを最大化するだけだと思うので、あなたが望むものではありません。私はまた、メモリマップされたファイルについて知っていると仮定し、彼らはあなたのニーズに合っていません。 –