4

大きなメモリ負荷 (> 5 GB) の可能性があるアプリケーションに取り組んでいますが、顧客の展開環境のために 32 ビットおよび .NET 2 ベースのデスクトップで実行する必要があります。これまでの私の解決策は、これらの大量のオブジェクトに対してアプリ全体のデータ ストアを使用することでした。オブジェクトがストアに割り当てられると、ストアはアプリによる合計メモリ使用量をチェックし、制限に近づいている場合はそれをチェックします。ストア内の古いオブジェクトの一部をユーザーの一時フォルダーにシリアル化し、必要に応じてそれらをメモリに取得し始めます。アプリ内の他のオブジェクトがメモリを使用し始めた場合、ストアには空き容量を確保するためのプロンプトが表示されないため、これは明らかに信頼できないことが証明されています。インメモリ データ オブジェクトを保持するためにウィーク ポインターを使用する方法を確認しました。これらのオブジェクトは、解放時にディスクにシリアル化されます。

これを処理するために使用すべき有用なパターン/パラダイムはありますか? 私は広範囲にグーグルで検索しましたが、まだ有用なものは見つかりませんでした.

4

3 に答える 3

4

仮想メモリがこの状況であなたをカバーするはずだったと思いましたか?

とにかく、いつでもメモリ内に 5 GB のデータすべてが本当に必要であると思われます。少なくともコンシューマ PC のように聞こえるものでは、そのすべてのデータをいつでも処理することはできません。あなたはデータについて詳しく説明しませんでしたが、オブジェクトを操作するにはセット全体をメモリに入れる必要があるという意味で、オブジェクト自体の設計が不十分であるように思えます。データをより適切な単位に断片化し、処理が必要になる直前に、ディスクからデータをプリエンプティブにロードすることを考えたことはありますか? この方法では、本質的に、より一定のパフォーマンスのトレードオフを支払うことになりますが、現在のスラッシングの問題を軽減できます。

于 2010-10-17T18:12:35.203 に答える
2

おそらく、Managing Memory-Mapped Filesに行き、ここを見てください。.NET 2.0 では、その関数に対して PInvoke を使用する必要があります。.NET 4.0 以降、 MemoryMappedFile には効率的な組み込み機能があります

こちらもご覧ください: http://msdn.microsoft.com/en-us/library/dd997372.aspx

5 GB のデータをメモリ内に効率的に格納することはできません。32 ビット OS ではプロセスごとに 2 GB の制限があり、 64 ビット Windows on Windows では32 ビット プロセスごとに 4 GB の制限があります。

だからあなたは選択肢があります:

  • Google の Chrome 方式 (および FireFox 4) を使用して、プロセス間でデータのポーションを維持します。アプリケーションが 64 ビット OS で開始され、アプリケーションを 32 ビットのままにしておく何らかの理由がある場合に適用できる可能性があります。しかし、これはそれほど簡単な方法ではありません。64 ビット OS を使用していない場合、5GB 以上の RAM をどこで入手できるのでしょうか?

  • 32 ビット OS を使用している場合、ソリューションはファイルベースになります。データをメモリに保持しようとすると(32ビットおよびプロセスあたり2 GBの制限の下でメモリにどのようにアドレス指定するのだろうかと思います)、OSはデータの一部(メモリページ)をディスクに継続的にスワップし、何度も復元します。アクセスします。あなたは大きなパフォーマンスの低下を被り、すでにそれに気づいています(私はあなたの問題の説明から推測しました)。主な問題 OS は、あるデータがいつ必要になり、別のデータがいつ必要になるかを予測できません。そのため、メモリページをディスク上で読み書きすることで最善を尽くそうとしています。

    したがって、ディスク ストレージを非効率的な方法で間接的に使用している場合、MMF は効率的かつ制御された方法で同じソリューションを提供します。

MMF を使用するようにアプリケーションを再構築することができ、OS は効率的なキャッシュに役立ちます。自分で簡単なテストを行ってください MMF で十分かもしれません。

とにかく、ファイルベース以外の使用可能な RAM よりも大きなデータセットを操作する他のソリューションはありません。そして通常、特にそのような量のデータが来て処理する必要がある場合は、データ操作を直接制御することをお勧めします。

于 2010-10-17T18:35:17.893 に答える
-1

膨大な量のデータを保存し、アクセシビリティを維持する必要がある場合、最も有用なソリューションは、データベースのようなデータ ストアと管理システムを使用することです。データベース (MySQL など) は、多くの一般的なデータ型と、もちろんバイナリ データも格納できます。おそらく、オブジェクトをデータベースに (直接またはビジネス オブジェクト モデルのプログラミングによって) 保存し、必要なときに取得することができます。このソリューションは、データ管理 (移動、バックアップ、検索、更新など) およびストレージ (データ層) に関する多くの問題を解決できる場合があります。これは場所に依存しません。この観点が役立つ可能性があります。

于 2010-10-17T18:20:30.073 に答える