Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据帧上的多处理。基于输入大小的混淆行为_Python_Pandas_Multiprocessing_Python Multiprocessing - Fatal编程技术网

Python 数据帧上的多处理。基于输入大小的混淆行为

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

我试图实现一个类似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 "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
results
2
N=10^7
results
13
,因为运算符
^
是异或(不是幂)。因此,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'