Python 数据帧上的多处理。基于输入大小的混淆行为
我试图实现一个类似df.apply的函数,但在数据帧的块之间进行了并行化。我编写了以下测试代码,看看我能获得多少(与数据复制等相比): 奇怪的行为: 对于N=10^7,它起作用 对于N=10^8,它给了我一个错误Python 数据帧上的多处理。基于输入大小的混淆行为,python,pandas,multiprocessing,python-multiprocessing,Python,Pandas,Multiprocessing,Python Multiprocessing,我试图实现一个类似df.apply的函数,但在数据帧的块之间进行了并行化。我编写了以下测试代码,看看我能获得多少(与数据复制等相比): 奇怪的行为: 对于N=10^7,它起作用 对于N=10^8,它给了我一个错误 Traceback (most recent call last): File "parallel_apply.py", line 27, in <module> r = apply_in_parallel(df, f, n=5) File "paralle
Traceback (most recent call last):
File "parallel_apply.py", line 27, in <module>
r = apply_in_parallel(df, f, n=5)
File "parallel_apply.py", line 14, in apply_in_parallel
result_list = pool.map(apply_f, df_chunks)
File "/usr/lib64/python2.7/multiprocessing/pool.py", line 227, in map
return self.map_async(func, iterable, chunksize).get()
File "/usr/lib64/python2.7/multiprocessing/pool.py", line 528, in get
raise self._value
AttributeError: 'numpy.ndarray' object has no attribute 'apply'
回溯(最近一次呼叫最后一次):
文件“parallel_apply.py”,第27行,在
r=平行应用(df,f,n=5)
文件“parallel_apply.py”,第14行,在apply_in_parallel中
result_list=pool.map(apply_f,df_chunks)
文件“/usr/lib64/python2.7/multiprocessing/pool.py”,第227行,在map中
返回self.map\u async(func,iterable,chunksize).get()
get中的文件“/usr/lib64/python2.7/multiprocessing/pool.py”,第528行
提升自我价值
AttributeError:'numpy.ndarray'对象没有属性'apply'
有人知道这里发生了什么吗?
我也很感激任何关于这种并行化方式的反馈。我希望函数比inc或sum每行和数百万行花费更多的时间
谢谢
array\u split
接受任何类似数组的参数(包括pandas.DataFrame
对象),但只返回保证返回numpy.ndarray
(数据帧不是)。当然,Ndarray没有apply
方法,这正是您看到的错误。事实上,我很惊讶这在任何情况下都能奏效。您需要将数据帧拆分为子帧,或者应用一个对数据阵列进行操作的函数。N=10^8
results2
,N=10^7
results13
,因为运算符^
是异或(不是幂)。因此,2行长度的df不能拆分为5个块。改用这个:N=10**4
和N=10**5
。使用这些值,您将看到时间上的差异。注意大于N=10**6
的值(在该值下,并行时间约为30秒,单个时间约为167秒)。并在apply_in_parallel()
中的末尾(在return
之前)使用pool.close()
自动关闭池中的所有工作进程
Traceback (most recent call last):
File "parallel_apply.py", line 27, in <module>
r = apply_in_parallel(df, f, n=5)
File "parallel_apply.py", line 14, in apply_in_parallel
result_list = pool.map(apply_f, df_chunks)
File "/usr/lib64/python2.7/multiprocessing/pool.py", line 227, in map
return self.map_async(func, iterable, chunksize).get()
File "/usr/lib64/python2.7/multiprocessing/pool.py", line 528, in get
raise self._value
AttributeError: 'numpy.ndarray' object has no attribute 'apply'