web-dev-qa-db-ja.com

別のpythonプロセスリアルタイムでデータフレームを更新する

たとえば、キュ​​ーシステムからPythonプロセスで、毎秒約500行のデータをリアルタイムで収集している(これをさらに並列化して約50 psに減らすことができる)とし、それをキューシステムに追加するとします。 DataFrame

rq = MyRedisQueue(..)
df = pd.DataFrame()
while 1:
    recv = rq.get(block=True)
    # some converting
    df.append(recv, ignore_index = True)

今の質問は:このデータに基づいてCPUをどのように利用するのですか?ですから、 [〜# 〜] gil [〜#〜] 、そして multiprocessing Managernamespacehere too を調べましたが、あるように見えます- 中央に保持されるデータフレームの遅延に関するいくつかの欠点 。掘り下げる前に、pool.map which I 認識されている プロセス間にpickleを適用します。これは遅くなり、オーバーヘッドが多すぎます。

それで、結局のところ、どうしたらいいのでしょうか?1秒あたり500行(または1秒あたり50行)の挿入を適用するためのCPU時間を残して、異なるプロセスにどのように転送できますか?子プロセスのデータの統計とヒューリスティック?

多分それは2つのプロセスの間にカスタムTCPソケットまたはキューイングシステムを実装する方が良いでしょうか?または、親プロセスの1つの大きなデータフレームへの高速アクセスを実際に許可するために、pandasまたは他のライブラリにいくつかの実装がありますか?パンダ大好き!

8
gies0r

pandasでの並列化は、おそらく別のエンジンで完全に処理するほうが適切です。

DatabricksによるKoalasプロジェクト または Dask's DataFrame をご覧ください。

1
jorijnsmit

簡単な解決策は、プロセスを2つの異なる段階に分けることです。 Asyncioを使用して、非ブロッキング方式でデータを受信し、その中で変換を実行します。第2段階では、Asyncioキューを使用してDataFrameを構築します。これは、Redisキューからデータを受信して​​いる間、別のプロセスでDataFrameを使用する必要がないことを前提としています。

Asyncioを使用したプロデューサー/コンシューマーモデルの作成例

0
arshit arora