現在、SQL データベースから引き出されたデータを保持し、他のいくつかのアプリケーション (Web サイト、Web サービスなど) で利用できるようにするキャッシュ システムを構築することを考えています。キャッシュは Windows サービスとして実行され、基本的にキャッシュ エントリを保持するスマート ディクショナリで構成されていると想定します。私の質問は、アプリケーションのワーキング セット (Windows Server 2003 で実行される) に制限はありますか? それとも物理メモリの量が限界ですか?
6 に答える
32ビットまたは64ビット?32 ビットは 2 GB (プロセス用)、64 ビットは 1 TB (エンタープライズ エディション 2003 サーバー)です。
ただし、CLR オブジェクトの最大サイズは64 ビットでも 2GB です。
更新:上記の情報は 2008 年に正しいものでした。より最近の情報については、Ohad の回答を参照してください。Windows 2016 サーバーには最大24TBを搭載できます。
私は最近、32 ビット プロセスで .NET のメモリ制限に関する広範なプロファイリングを行っています。.NET アプリケーションに最大 2.4GB (2^31) を割り当てることができるという考えに誰もが衝撃を受けますが、残念ながらこれは真実ではありません :(。しかし、.NET 自体には独自のオーバーヘッドがあり、メモリ制限を押し上げる典型的な実世界のアプリケーションでは約 600 ~ 800MB を占めているようです. これは、整数の配列を割り当てるとすぐに、約1.4GB の場合、OutOfMemoryException() が発生することが予想されます。
明らかに 64 ビットでは、この制限はずっと後に発生します (5 年後にチャットしましょう :)) が、メモリ内のすべての一般的なサイズも増加します (私はそれが ~1.7 から ~2 倍になることがわかりました)。
私が確かに知っていることは、オペレーティング システムからの仮想メモリのアイデアが、1 つのプロセス内で事実上無限の割り当てスペースを提供するわけではないということです。一度に実行されるすべての (多数の) アプリケーションが 2.4GB のすべてをアドレス指定できるようにするためだけに存在します。
MSDNの次の表は、クエリに対する最も正確な回答です。IMAGE_FILE_LARGE_ADDRESS_AWARE フラグはマネージ コンパイラから直接設定できないことに注意してください。ただし、幸いなことに、ビルド後に editbin ユーティリティを使用して設定できます。4GT は /3gb フラグを指します。
32 ビット Windows では、/3gb フラグを指定して Windows を起動し、アプリに「ラージ アドレス対応」のフラグを立てることで、メモリをもう少し増やすことができます。
マティアス、
実際には直接の質問に対する答えではありませんが、この問題にアプローチする別の方法で、キャッシング ソリューションの大きな頭痛の種になる可能性のある大きな落とし穴のいくつかを回避できます。(申し訳ありませんが、この問題について推奨される読書はありません。)
以前のプロジェクトでこれを実装しましたが、他の問題が発生しました。
オフライン アクセスの場合、デスクトップで sql Express を使用して、データベースのミラー (またはキャッシュする必要があるビットのみ) を作成できますか? あとは、アプリケーションが指しているデータベースを切り替えるだけです。差分を保存してサーバーに再生することもできますが、これには別の問題があります。必要に応じて、ローカル コピーのアクセス許可を変更して、これを読み取り専用にすることができます。
あなたが作成しようと考えている辞書は、Sql インデックスに非常によく似ています。あなたがそのように設計できるなら、私はあなたのために仕事をするためにSQLに頼ります. なぜその車輪を再発明するのですか?その場合、特にこれが Windows サービスの場合は、キャッシュの有効期限とメモリ管理について慎重に検討する必要があります。
幸運を、
サム
他の Windows プログラムと同様に、アドレス空間によって制限されます。つまり、32 ビットでは、2GB のアドレス空間を持つことができます。x64 では、8 TB を使用できます。
8TB の物理メモリがない場合は、ページングが開始されます。