私は数百万行のpandas Dataframeを持っており、行単位の操作を行う必要があります。私はMulticore CPUを持っているので、マルチプロセッシングを使ってそのプロセスをスピードアップしたいと思います。私がこれをやりたいのは、同じサイズのデータフレームでデータフレームを分割し、それぞれを別々のプロセスで処理することです。これまでのところとても良い... 問題は、私のコードがOOPスタイルで書かれていて、マルチプロセッサプールを使ってPickleエラーが出るということです。私がしていることは、クラス関数self.X
への参照をプールに渡すことです。私はさらに、X
(読み取りアクセスのみ)のクラス属性を使用します。私は実際に関数型プログラミングに戻ってほしくない...したがって、OOP環境でマルチプロセッシングを行うことは可能でしょうか?クラス関数とクラス属性を使用したマルチプロセッシング
0
A
答えて
0
クラス内のすべての要素(サブプロセスに渡す)がpicklableである限り、可能である必要があります。それがあなたが確認しなければならない唯一のことです。あなたのクラスに、そうでない要素があれば、それをプールに渡すことはできません。 self.x
だけを渡しても、self.y
のようなものはすべてpicklableでなければなりません。
私はそのように私のパンダのデータフレームの処理を実行します。私が持っていない
import pandas as pd
import multiprocessing as mp
import numpy as np
import time
def worker(in_queue, out_queue):
for row in iter(in_queue.get, 'STOP'):
value = (row[1] * row[2]/row[3]) + row[4]
time.sleep(0.1)
out_queue.put((row[0], value))
if __name__ == "__main__":
# fill a DataFrame
df = pd.DataFrame(np.random.randn(1e5, 4), columns=list('ABCD'))
in_queue = mp.Queue()
out_queue = mp.Queue()
# setup workers
numProc = 2
process = [mp.Process(target=worker,
args=(in_queue, out_queue)) for x in range(numProc)]
# run processes
for p in process:
p.start()
# iterator over rows
it = df.itertuples()
# fill queue and get data
# code fills the queue until a new element is available in the output
# fill blocks if no slot is available in the in_queue
for i in range(len(df)):
while out_queue.empty():
# fill the queue
try:
row = next(it)
in_queue.put((row[0], row[1], row[2], row[3], row[4]), block=True) # row = (index, A, B, C, D) tuple
except StopIteration:
break
row_data = out_queue.get()
df.loc[row_data[0], "Result"] = row_data[1]
# signals for processes stop
for p in process:
in_queue.put('STOP')
# wait for processes to finish
for p in process:
p.join()
この方法では、データフレームの大きな塊を渡すために、私は私のクラスではpickle化可能な要素を考える必要はありません。
関連する問題
- 1. [Range]属性のクラス定数の使用
- 2. Pythonクラス属性の使用
- 3. PHPのクラス属性にクラス定数を使用するには?
- 4. 別のクラスのTkinterマルチプロセッシング関数と呼び出し関数
- 5. 関数でネストされたクラスと属性の検索
- 6. UMLクラス図のAssociation属性またはList属性を使用しますか?
- 7. python:クラスの属性とインスタンスの属性
- 8. パラメータ対属性(クラス変数)?
- 9. クラスの属性を変更するためのスカラ関数
- 10. クラス - Pythonのリストを使用した属性エラー
- 11. クラス属性
- 12. 属性クラス要素を配列として使用
- 13. Python - クラス属性としての関数がバインドされたメソッドになる
- 14. クラス属性評価とジェネレータ
- 15. ILMergeとカスタム属性のクラス
- 16. カスタムdictクラスをPythonクラスの__dict__属性として使用したときの奇妙な動作
- 17. dictをクラス属性として参照
- 18. クラス属性を他の(同じ属性)クラスにマッピング
- 19. インスタンス属性を使用してクラス属性を定義する方法は?
- 20. Pythonのクラス/属性
- 21. 必須クラス属性
- 22. tkinter変数クラスをクラス属性として使用するのは悪い習慣ですか?
- 23. アノテーション属性としてのJavaクラス名
- 24. テンプレート関数をクラス関数の戻り値として使用
- 25. プロパティエディタを使用してクラスに属性を追加する
- 26. update_attributeを使用してRailsのクラス属性を更新する
- 27. JavaScriptを使用してCSSクラス属性を変更する
- 28. Python:クラス自体の静的クラス属性
- 29. Pythonでdjangoを使用してクラス属性にアクセス
- 30. JsonConvert.PopulateObjectがJsonConverterクラス属性を使用していません