15

こんにちは、Python とプロセスの間で少量のデータ (< 1K) を共有したいと思います。データは、急速かつ頻繁に (24x7x365) 変更される物理 pc/104 IO データです。データを書き込む単一の「サーバー」と、その一部を読み取る複数のクライアントが存在します。これが実行されるシステムは、ハード ドライブではなくフラッシュ メモリ (CF カード) を使用するため、ファイル ベースのスキームでフラッシュ メモリが消耗するのが心配です。また、100% 太陽光発電であるため、使用する電力 (プロセッサ時間) を減らしたいと考えています。

  • これは正当な心配ですか?CFカードをSSDに変更できるかもしれません。
  • mmap を使用して値を変更すると、データが物理的にディスクに書き込まれますか?それとも、これは仮想ファイルですか?
  • Debian で実行するので、Python モジュール用の POSIX IPC が最適なソリューションです。誰かがそれを使用しましたか?
  • Python Object Sharing (POSH)モジュールを試した人はいますか? 一見有望に見えますが、「アルファ版」であり、積極的に開発されているようには見えません。

ありがとうございました

更新: 最大データ更新レートを約 10 Hz に遅くしましたが、より一般的には 1 Hz です。クライアントは、一定の更新レートではなく、値が変化したときにのみ通知されます。各サーバーが特定の種類の機器または機能に特化した複数サーバー/複数クライアント モデルに移行しました。ほとんどのプログラミングは Java プログラマーによって行われることが判明したため、最終的には JSON-RPC over TCP を使用することになりました。サーバーは Java で作成されますが、メインのクライアントを Python で作成したいと考えており、JSON-RPC の実装を調査しています。

4

4 に答える 4

8

サーバー プロセスでデータをファイルに書き込む代わりに、クライアント プロセスに直接書き込むこともできます。

UNIX ドメイン ソケット (または、クライアントが異なるマシンで実行されている場合は TCP/IP ソケット) を使用して、各クライアントをサーバーに接続し、サーバーがそれらのソケットに書き込むようにします。特定の処理モデルに応じて、クライアント/ソケットの選択は、サーバー (ラウンド ロビンなど) によって行われるか、クライアントがより多くの準備ができていることを通知することによって行われる場合があります。

于 2010-01-05T14:48:02.883 に答える
4

ramfs パーティションを作成し、そこに書き込みます。(tmpfs を使用できますが、tmpfs とは異なり、ramfs はディスクにスワップされません)。ただし、ramfs にはサイズ制限がないため、メモリが不足しないように注意する必要があります。そこにはほんの少しのデータしか書き込んでいないので、問題にはなりません。

この方法では、データがディスクに書き込まれることはありません (注: 電源が切れるとデータが失われます)。

ramfs のドキュメントも参照してください

于 2010-01-05T14:38:26.877 に答える
2

mmap システム コールに関するウィキペディアの記事によると、メモリ マップされたファイルの内容は、更新時にディスクに書き戻されます。

multiprocessing モジュール(標準ライブラリ内)、特にプロセス間の共有状態の部分を見ましたか?

Piskvor が言及した Ramfs も、特にすべてのプロセスが Python で記述されているわけではない場合に、優れたソリューションのように思えます。

于 2010-01-05T17:03:56.253 に答える
0

フラッシュ システムで実行する場合は、ファイル システムがフラッシュ メモリの寿命を最大限に延ばすように適切に設計されていることを確認してください (ウェア レベリング)。 JFFSと、私が思うに、他の組織は、これを効果的に行うことができるようになりました。そのようなシステムを使用する場合、フラッシュの使用について過度に心配する必要はありませんが、一定のデータ ストリームを書き込んでいる場合は、フラッシュでそれを行うことを避けたいと思うでしょう。

RAM ファイルシステムを使用することをお勧めします。システム設計で許される場合は、ファイルシステムを完全に回避することをお勧めします。そのために、あなたはPOSHに言及します。私は試したことはありませんが、Pyro ("PYthon Remote Objects") がいくつかの同様のケースでエレガントで効果的なソリューションであることがわかりました。

そしてもちろん、標準ライブラリmultiprocessingモジュールもあります。これは、プロセス間の通信方法に関していくつかの類似点があります。私は、この分野で新たな開発があればそこから始めて、うまくいかなかった場合にのみ他の場所に行きます。

于 2010-01-05T18:22:37.533 に答える