私は、C#がページファイルにオブジェクトを書き込むことが可能かどうか疑問に思っていました。でも、64ビット版のWindows上で -C#はオブジェクトをページファイルに書き込むことができますか?
は、私はすでに.NETアプリケーションの仮想マシンのみが2 GBのRAMを使用し、そのずっと前にメモリ不足になると一つのオブジェクトを許可するように制限されていることを知っています。
しかし、膨大な量の文字列を読み込むことができるようにする必要があります(大きなものではなく、小さなものもたくさんあります)。読み込みが可能かどうか不思議に思って、必要になるまでスワップ空間に書き込めますもう一度(残念ながら、私が作業しているコードを呼び出すアプリケーションによって強制されるため、すべての文字列のロードを防ぐことはできません)。
public static void Main()
{
ICollection<StringBuilder> builders = new LinkedList<StringBuilder>();
double used_ram = 2*1024*1024*1024L;
int blocksize = 12800000;
int blocks = (int) (used_ram/blocksize);
for (int i = 1; i < blocks ; i++)
{
StringBuilder sb = new StringBuilder(blocksize/2);
builders.Add(sb);
}
Console.ReadLine();
}
私がいた:私はそれが一つの巨大な文字列を割り当てようとしませんが、(それがする)次のプログラムは、同様にメモリ不足になるかどうかを確認するために試してみたそれをプロトタイプに
文字列がスワップ空間に書き込まれることを期待し、アプリケーションに強制的にそれをさせることができる方法があるかどうか疑問に思っていました。
EDIT:スワップファイルの使用をページファイルに変更しました(説明のためにありがとう)。
私の質問を強化するために:ランタイムの唯一の制限は、1GBのメモリが2GB以上のメモリを割り当てることができない場合です。なぜ、上記のコードがメモリ不足になるのですか?リストは2GBすべての文字列ビルダーへの参照を保持することによってメモリの?
"スワップへの書き込み"は、アプリケーションが行うことではなく、OSがアプリケーションに対して行うことです。あなたのアプリケーション/環境が2Gアドレス空間に制限されている場合、 "スワップ"の量はそれを増加させません。 – Mat
残念ながらそれは私が期待したことです - 私は本当にこれらの概念すべてを実際に把握するためには、メモリ管理の基礎を調べなければならないと思います。したがって、ランタイムによって割り当てられるスペースを増やす方法はありませんか?それから私はおそらく、文字列をファイルや必要なものが格納されるまで書き込む必要があります。 – BergmannF
スワッピングは70年代にスタイルから外れました。現在、仮想メモリシステムは「ページング」を行っています。 Windowsでは、仮想メモリは「ページファイル」にページされます。 – Gabe