2012-03-07 16 views
2

私は1日に100回実行するコンソールアプリケーションを持っていて、大きなファイル(例えば、合計サイズが3-4Gbの50個のファイル)から同じデータを読み込みます。.NETプロセス間で大きなインメモリコレクションを共有することは可能ですか?

私は、アクセスを高速化し、データのライフタイムを制御するために、メモリにデータをキャッシュするWindowsサービスを作成することを考えています(これらの50個のファイルのセットは日によって異なります)。

私は別の考慮事項があるしかし、コンソールアプリケーションが...サービスによって書かれたメモリから

をファイルを読み込みますので、共有メモリマップファイルを実装するつもりです。データは、毎回.NETオブジェクトに変換されます。

私の質問 - は、ファイルではなくの.NETオブジェクト(リスト)を共有する手段がありますか?

P.S.データは手動でシリアル化された一連のバイトです

+0

TomTomの回答を参照してください。この問題を回避するには、要件を満たす場合は、データを管理し、そのデータに対してロジックを実行するサービスを作成することができます。その単純な検索や集計が.....の場合、コンソールアプリケーションは単にサービス内のメソッドを呼び出し、そのメソッドの結果を処理します。 – Polity

+0

3-4 GBのメモリ?本当に?ああ、それは痛い。 – Steve

+0

@Polity - もし私がマップされたファイル等を気にしないだろうなど、ロジック自体は1日100回変更します。データは静的です。これが私が説明した方法でやっている理由です... –

答えて

3

私はこれをソケットサーバーを提供するサービスとして実装し、サービスに接続してTCP/IPを介して要求を行い、応答を戻すようにします。あなたはすでに(質問ごとに)シリアライズされており、非常にスケーラブルであるので、設定はかなり簡単です。このサービスは、すべてをメモリで楽しく実行できるようにします。クライアントとサーバーを同じexeにすることもできます。Environment.UserInteractiveがクライアントとサーバーのどちらであるかを判断するときにチェックしてください。

1つの注意:帯域幅を低く抑えて、チャットAPIを避けてください。意味:クライアントが200の要求をして考えることをたくさんしないでください。要求全体をパッケージ化してサーバーに送ってください。 サーバは、すべてローカルにそのことを心配して、大量のネットワークトラフィックを避けてください。

+0

マーク。あなたはより良い質問を読むべきです。私はすでにソリューションマップのメモリファイルを持っています。私は、ファイルではないオブジェクトをマップする方法があるのだろうかと思っていました...ソケットのアイデアは本当に助けません - バイトから数百万のオブジェクトをdeserialiseする必要があります..また、名前付きパイプがTCPよりも高速です。あなたのポイントは何でしたか? –

+2

@Bobbはい、あなたは*解決策を持っています。複数ある。あなたはマネージ*オブジェクトを求めていましたが、それはできません(あなたが今やっていることをやる必要があります)。しかし、私の答えの推力は単純に「違うやり方です。あなたの問題がうまくいかない場合は、うまくいきますが、私はあなたの設定に関する知識がありませんので、気をつけてください。 ;細かい;私が見ているほとんどの同様のシナリオでは、我々はまた、ネットワーク、したがってソケットを介して中央ノードを捧げるだろうすべてのローカル、偉大な! –

+0

フェア十分.... –

3

メモリに.NETオブジェクト(リスト)を共有する方法はありますか?

割り当てられているオブジェクトは特定のプロセスにありません。

リモーティングのような細かいことができますが、基本的にプロセス間のアクセスをマーシャリングします。

管理されていない領域(共有メモリ)を共有することはできますが、これには.NETオブジェクトを含めることはできません。これらをマーシャリングする必要があります。

+0

メモリマップされたファイルは管理オブジェクトになりました。 –

+0

ああ - はいといいえ。 FILESは存在しますが、その中のオブジェクトではありません。ポスターはすでにmemのマップされたファイルについて話しました。問題は、ファイルを読むごとに構造体やオブジェクトを整理し直す必要があることです。クラスインスタンスをgcと共有する方法は提供されていません。それは、シャードされたオブジェクトに関するものです。共有データスペース - はい。別の質問。 – TomTom

1
  • このアプリ1日あたりの百倍を実行していると、あなたは、アプリケーションがそれを実行する代わりに、近くにあなたを維持していない理由をメモリに「データ」を維持し、再びそれを再起動する方法を探している場合?

  • ファイルをメモリにロードして、そのファイルを精緻化するWindowsサービスを作成することができます。もちろんサービスを停止または再起動すると、データをリロードする必要があります

  • もう一つの解決策は、メモリオブジェクト(.Remotingやそれに類するものを使ってのみ行うことができます)を保存する代わりに、どうしてですか?ファイルをデータベースにインポートして処理を高速化し、プロセス間で簡単に共有できますか?私の知る限り

0

、あなたは直接シェアは、複数の.NETプロセス間のコレクションは、そのプロセスの境界を越えてデータをマーシャリングする必要がありますすることはできません。これにはかなりのCPUオーバーヘッドがあり、キャッシュプロセスとクライアントの両方のオブジェクトのメモリを消費します。

メモリマッピングされたファイルでは、いくらか改善された可能性がありますが、それでも共有オブジェクト上に.NETオブジェクトを直接マップすることはできませんが、 "データは一連のバイトを手動でシリアル化します。それで十分に近いフィット感があるかもしれませんか?

私はかなり.NET memory mapped filesをgrokしていません。ネイティブコードの大きな点は、単にファイルをメモリポインタとして扱うことです。.NET MMFではアクセサメソッドを呼び出す必要があり、.NETオブジェクト(?)にメモリをコピーする必要がありますが、ファイルを何度も繰り返し読み込むよりもパフォーマンスが向上する可能性があります。

+0

これは私がやることです。質問を読んで: "私は共有メモリマップされたファイルを実装するつもりです" .... –

関連する問題