0

かなりの量のデータを生成する 1 つのアプリケーションがあり、別の C++ アプリケーションがアクセスできるようにしたいと考えています。プラットフォームは RHEL5、それが重要な場合は g++ です。

以前は、データを /dev/shm (基本的には Linux メモリ ドライブ) に書き込んでから、他のアプリケーションにそこから読み取らせていました。

ただし、これは、ofstream、次に ifstream があり、データをメモリに再ロードするため、かなり非効率的です。さらに、データをテキスト ファイルとしてメモリに格納すると、単にメモリとして保持するよりも多くのスペースが必要になるように思われます (これが 100% 正しいかどうかはわかりませんが)。

共有したいデータは次の形式です

vector< vector<struct> > mydata;

他のアプリケーションで次のようなことができるようにしたい

mydata.at(ii).back()

必要なデータを取得します。mydata には、実際にはかなりの量のデータが含まれます。それをCSV形式のファイルに出力すると、10GBくらいになるかもしれません。私が取り組んでいるサーバーには、これを処理するのに十分な 24 GB のメモリがあります。

さらに、この取得は、最初のアプリケーションが mydata にさらにエントリを追加するときに発生します (潜在的な競合状態があるのでしょうか?)。

C++ で vector< vector > mydata; を共有する方法はありますか? 2 つのアプリケーション間で? もしそうなら、使用するのに最適な実装は何ですか? 可能であれば、サードパーティのライブラリは避けたいと思います。

4

2 に答える 2

6

サードパーティのライブラリを避けたいと思うかもしれませんが、最善の迅速な解決策があります。Boost.Interprocess を試してみてください。共有メモリ セーフなコンテナー (ベクターなど) と、操作が簡単なインターフェイスを提供します。また、ヘッダーのみのライブラリの 1 つであるため、他のいくつかのライブラリよりも簡単に統合できます。

最新バージョンのドキュメントについては、こちらのリンクを参照してください: http://www.boost.org/doc/libs/1_53_0/doc/html/interprocess.html

そこにもかなりの数の例があります。それができることの概要をすぐに理解できるはずです。

于 2013-04-03T16:15:22.810 に答える
1

C++ で vector< vector > mydata; を共有する方法はありますか? 2 つのアプリケーション間で? もしそうなら、使用するのに最適な実装は何ですか? 可能であれば、サードパーティのライブラリは避けたいと思います。

アプリケーションでは、プロセスを意味する場合、答えはノーです。2 つのプロセス間でデータ構造を共有することはできません。プロセス間でデータを共有するには、共有メモリを使用する必要があります(特定したように)。(メッセージを使用してプロセス間通信を行うことはできますが、ユースケースはおそらくそれに適していません。

スレッドの使用を検討しますか? mydataそうすれば、実行の 2 つのスレッド間で共有できます。mutex共有データへのアクセスを同期するには、 が必要です。

C++11 を使用している場合は、C++ 標準ライブラリで完全に実行できますstd::thread。そうでない場合は、POSIX スレッド ライブラリを使用する必要がある場合がありますpthreads

さらに、この取得は、最初のアプリケーションが mydata にさらにエントリを追加するときに発生します (潜在的な競合状態があるのでしょうか?)。

正確ではありませんが、リーダー/ライター ロックを使用して複数のリーダー スレッドが並行して進行できるようにすることは可能ですが、ライター スレッドが共有オブジェクトの変更を開始すると、すべてのリーダー スレッドが停止する必要があります。その他の問題。

于 2013-04-03T16:17:06.937 に答える