たとえば、キューシステムから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 Managernamespace 、 here too を調べましたが、あるように見えます- 中央に保持されるデータフレームの遅延に関するいくつかの欠点 。掘り下げる前に、pool.map
which I 認識されている プロセス間にpickle
を適用します。これは遅くなり、オーバーヘッドが多すぎます。
それで、結局のところ、どうしたらいいのでしょうか?1秒あたり500行(または1秒あたり50行)の挿入を適用するためのCPU時間を残して、異なるプロセスにどのように転送できますか?子プロセスのデータの統計とヒューリスティック?
多分それは2つのプロセスの間にカスタムTCPソケットまたはキューイングシステムを実装する方が良いでしょうか?または、親プロセスの1つの大きなデータフレームへの高速アクセスを実際に許可するために、pandas
または他のライブラリにいくつかの実装がありますか?パンダ大好き!
pandas
での並列化は、おそらく別のエンジンで完全に処理するほうが適切です。
DatabricksによるKoalasプロジェクト または Dask's DataFrame をご覧ください。
簡単な解決策は、プロセスを2つの異なる段階に分けることです。 Asyncioを使用して、非ブロッキング方式でデータを受信し、その中で変換を実行します。第2段階では、Asyncioキューを使用してDataFrameを構築します。これは、Redisキューからデータを受信している間、別のプロセスでDataFrameを使用する必要がないことを前提としています。