0

現在、64 ビット Linux プラットフォームで C (プログラム A) でネットワーク データ使用量モニターを作成中です。パケット スニファーとして、パケットを失う危険を冒さずにファイルやデータベースにデータを書き込む時間はあまりありません。そのような目的で別のスレッドを使用することもできますが、(存在する場合) もっとクリーンな解決策は、別の C プログラムまたは理想的には python cgi スクリプト (プログラム B) からメモリに格納されたこのデータにアクセスすることだと考えていました。そうすれば、データはオンデマンドで利用できるようになります。メモリ内のデータは、プログラム B から読み取り専用でアクセスされます。これは可能ですか? もしそうなら、どのように?ありがとう。

アップデート:

mmap() を使用してデータをメモリに格納し、shmget() を使用して取得できることがわかります。ただし、shmgetは古いと言う人もいます。他にどのようなオプションがありますか?

渡される 2D 配列は、5000x4 int または 5000x15 char の大きさになる可能性があります。

posix_ipc Python から共有メモリにアクセスする方法として有望に思えます (プログラム B)。これがCで作成された共有メモリ(プログラムA)で機能するかどうかは誰にもわかりませんか?

posix_ipcをダウンロードしたところ、非常にクールなデモが含まれています。最初のものは、共有メモリを使用して互いに通信する 2 つのプロセスを示しています。2 つのプロセスは、C と python の任意の組み合わせにすることができ、4 つのそれぞれのソースが提供されます。私がやろうとしていることを処理する最も効率的な方法のように見えますが、まだそれで遊ぶ時間がありません. やったらまた報告します。

以下のcheの提案もうまくいくように思えます。私はそれを私の計画Bとして保持します.

助けてくれてありがとう!

4

4 に答える 4

1

共有メモリは、特に2番目のプログラムが最初のプログラムによって書き込まれた統計を読み取る場合は特に、2つのCプログラム間でこれを行うための最良の方法のように思えます。

この言語では少し低レベルであるため、Pythonからこのメモリにアクセスするのは少し複雑かもしれません。最も簡単な方法は、共有メモリにアクセスして情報をプレーンテキストで出力し、CGIスクリプトから呼び出すCプログラムを用意することです。

于 2012-10-23T19:07:32.137 に答える
1

SQLite、インメモリ モードを使用します。これにより、フットプリントを大きくすることなく、データベースが提供するすべての利点が得られます。

http://www.sqlite.org/inmemorydb.html

于 2012-10-23T18:47:51.277 に答える
1

posix_ipc に関して: はい、共有メモリ領域は「単なるメモリ」であり、アクセス元の言語に完全に依存しません。

ただし、そのメモリの使用を調整する方法は、「最小公分母」に限定される場合があります。固定長データ フィールドを含む固定長構造体の配列は、テキスト コンテンツの特定の配置と同様に単純で簡単です。「変数フィールドとガベージ コレクションを持つオブジェクト」のようなものは、2 つの言語間でバインドするのが難しいでしょう。

記録のために、mmap共有/共有可能なメモリにアクセスする1つの方法があります。shmgetコマンドのファミリー (shmgetおよびshmatなどshmctl) は別のものです。2 つを混在させることは困難であり、特に有利ではありません。(この名前は共有メモリ領域shmgetを指すgetものであり、必ずしもそのメモリへの読み取り専用アクセスを意味するものではないことに注意してください。)

于 2012-10-23T19:45:36.523 に答える
0

単純なキー/値のメモリ内ストレージが必要な場合は、memcachedを試してください http://memcached.org/

Webアプリ開発でもよく使われるテクノロジーを学ぶためのプラスボーナス付き

于 2012-10-23T18:50:47.360 に答える