質問

現在、SQLデータベースから取得したデータを保持し、他のいくつかのアプリケーション(ウェブサイト、ウェブサービスなど)で利用できるようにするキャッシュシステムの構築を検討しています。キャッシュはWindowsサービスとして実行され、基本的にはキャッシュエントリを保持するスマートディクショナリで構成されていると考えています。私の質問は、アプリケーションのワーキングセットに制限があるかどうかです(Windows Server 2003で実行されます)。または、物理メモリの量が制限ですか?

役に立ちましたか?

解決

32ビットまたは64ビット? 32ビットは2GB(プロセス用)、64ビットは 1TB(Enterprise Edition 2003サーバー)

ただし、CLRオブジェクトの最大サイズは2gb 64ビットでも。

更新:上記の情報は2008年に修正されました。最新の情報については、 Ohadの回答をご覧ください。情報。 Windows 2016サーバーには、最大 24TB

他のヒント

最近、32ビットプロセスで.NETのメモリ制限に関する広範なプロファイリングを行っています。 .NETアプリケーションで最大2.4GB(2 ^ 31)まで割り当てることができるという考えに私たち全員が衝撃を受けますが、残念ながらこれは真実ではありません:(。アプリケーションプロセスには使用するスペースが多く、オペレーティングシステムは素晴らしいただし、.NET自体にはオーバーヘッドがあり、メモリの制限を超える一般的な現実のアプリケーションでは約600〜800 MBを占めるようです。これは、整数の配列を割り当てるとすぐに、 1.4GB、OutOfMemoryException()が表示されるはずです。

明らかに64ビットでは、この制限は後で発生します(5年後にチャットしましょう:))が、メモリ内のすべての一般的なサイズも大きくなります(私はそれが〜1.7〜〜2倍だとわかります) 。

私が確実に知っていることは、オペレーティングシステムの仮想メモリのアイデアは、1つのプロセス内で事実上無限の割り当てスペースを与えないことです。そこにあるのは、2.4GBの全容量が一度に実行されるすべての(多くの)アプリケーションにアドレスできるようにするためです。

32ビットWindowsでは、/ 3gbフラグを使用してWindowsを起動し、アプリに"ラージアドレス認識"

のフラグを立てることにより、もう少しメモリを確保できます

マティアス、

実際には直接的な質問に対する答えではなく、この問題に対処する別の方法であり、いくつかの大きな落とし穴を回避します。 (申し訳ありませんが、この件に関する推奨読書はありません。)

以前のプロジェクトでこれを実装しましたが、他の問題が発生しました。

オフラインアクセスの場合、デスクトップでsql expressを使用してデータベースのミラーを作成できますか(またはキャッシュする必要がある部分のみ)。あとは、アプリケーションが指しているデータベースを切り替えるだけです。差分を保存してサーバーにリプレイすることもできます-これには他の問題もあります。ローカルコピーのアクセス許可を変更して、このようにする必要がある場合は、このコピーを読み取り専用にすることができます。

SQLインデックスのように音を作成することを考えている辞書。あなたがそれをそのように設計できるなら、私はあなたのために仕事をするのにSQLに頼るでしょう。なぜその車輪を再発明するのですか?その場合、特にこれがWindowsサービスの場合は、キャッシュの有効期限とメモリ管理について慎重に検討する必要があります。

幸運を祈ります

サム

他のWindowsプログラムと同様に、アドレス空間によって制限されます。つまり、32ビットでは、2GBのアドレススペースを確保できます。 x64では、8TBを使用できます。

8TBの物理メモリがない場合、ページングが開始されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top