【发布时间】:2017-10-31 15:54:09
【问题描述】:
我需要在一个数据分析 python 项目中同时使用类和多处理功能,但我在 Google 上没有找到很好的示例。
我的基本想法 - 这可能是错误的 - 是创建一个具有大变量的类(在我的例子中是 pandas 数据框),然后定义一个计算操作的方法(在这种情况下是总和) .
import multiprocessing
import time
class C:
def __init__(self):
self.__data = list(range(0, 10**7))
def func(self, nums):
return sum(nums)
def start_multi(self):
for n_procs in range(1, 4):
print()
time_start = time.clock()
chunks = [self.__data[(i-1)*len(self.__data)// n_procs: (i)*len(self.__data)// n_procs] for i in range(1, n_procs+1)]
pool = multiprocessing.Pool(processes=n_procs)
results = pool.map_async(self.func, chunks )
results.wait()
pool.close()
results = results.get()
print(sum(results))
print("n_procs", n_procs, "total time: ", time.clock() - time_start)
print('sum(list(range(0, 10**7)))', sum(list(range(0, 10**7))))
c = C()
c.start_multi()
代码不能正常工作:我得到以下打印输出
sum(list(range(0, 10**7))) 49999995000000
49999995000000
n_procs 1 total time: 0.45133500000000026
49999995000000
n_procs 2 total time: 0.8055279999999954
49999995000000
n_procs 3 total time: 1.1330870000000033
即计算时间增加而不是减少。那么,这段代码的错误是什么?
但我也担心 RAM 的使用,因为当创建变量块时,self.__data RAM 的使用会翻倍。在处理多处理代码时,更具体地说,在这段代码中,是否有可能避免这种内存浪费? (我保证将来我会把所有东西都放在 Spark 上 :))
【问题讨论】:
-
您似乎理解得很准确,您必须创建副本并将它们发送到不同的进程。这不可能比普通的
sum更快。顺便说一句,您在__data属性中使用双下划线是否有特殊原因? -
但是,这与你使用类无关。您应该阅读
multiprocessing文档中关于共享状态的部分。这不是微不足道的。
标签: python multiprocessing pool