Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.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 3.4中使用多处理时发生断言错误_Python_Parallel Processing_Multiprocessing - Fatal编程技术网

在Python 3.4中使用多处理时发生断言错误

在Python 3.4中使用多处理时发生断言错误,python,parallel-processing,multiprocessing,Python,Parallel Processing,Multiprocessing,我对Python非常陌生,对并行处理也完全陌生 我一直在编写分析点状图像数据的代码(想想lite),并尝试使用多处理模块来加速我的分析代码 对于小型数据集,我看到了相当不错的速度提升,最多可达到四个内核。对于大型数据集,我开始得到断言错误。我试图制作一个产生相同错误的简化示例,如下所示: import numpy as np import multiprocessing as mp import os class TestClass(object): def __init__(self

我对Python非常陌生,对并行处理也完全陌生

我一直在编写分析点状图像数据的代码(想想lite),并尝试使用
多处理
模块来加速我的分析代码

对于小型数据集,我看到了相当不错的速度提升,最多可达到四个内核。对于大型数据集,我开始得到断言错误。我试图制作一个产生相同错误的简化示例,如下所示:

import numpy as np
import multiprocessing as mp
import os

class TestClass(object):
    def __init__(self, data):
        super().__init__()
        self.data = data

    def top_level_function(self, nproc = 1):

        if nproc > os.cpu_count():
            nproc = os.cpu_count()

        if nproc == 1:
            sums = [self._sub_function() for i in range(10)]
        elif 1 < nproc:
            print('multiprocessing engaged with {} cores'.format(nproc))
            with mp.Pool(nproc) as p:
                sums = [p.apply_async(self._sub_function) for i in range(10)]
                sums = [pp.get() for pp in sums]

        self.sums = sums

        return sums

    def _sub_function(self):
        return self.data.sum(0)


if __name__ == "__main__":
    t = TestClass(np.zeros((126,512,512)))
    ans = t.top_level_function()
    print(len(ans))
    ans = t.top_level_function(4)
    print(len(ans))

    t = TestClass(np.zeros((126,2048,2048)))
    ans = t.top_level_function()
    print(len(ans))
    ans = t.top_level_function(4)
    print(len(ans))
将numpy导入为np
将多处理作为mp导入
导入操作系统
类TestClass(对象):
定义初始化(自身,数据):
super()。\uuuu init\uuuuu()
self.data=数据
def顶层功能(自身,nproc=1):
如果nproc>os.cpu\u计数():
nproc=os.cpu\u count()
如果nproc==1:
sums=[self.\u sub.\u函数(),用于范围(10)内的i)
elif 1
哪些产出:

10
multiprocessing engaged with 4 cores
10
10
multiprocessing engaged with 4 cores
Process SpawnPoolWorker-6:
Traceback (most recent call last):
  File "C:\Anaconda3\lib\multiprocessing\process.py", line 254, in _bootstrap
    self.run()
  File "C:\Anaconda3\lib\multiprocessing\process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Anaconda3\lib\multiprocessing\pool.py", line 108, in worker
    task = get()
  File "C:\Anaconda3\lib\multiprocessing\queues.py", line 355, in get
    res = self._reader.recv_bytes()
  File "C:\Anaconda3\lib\multiprocessing\connection.py", line 216, in recv_bytes
    buf = self._recv_bytes(maxlength)
  File "C:\Anaconda3\lib\multiprocessing\connection.py", line 318, in _recv_bytes
    return self._get_more_data(ov, maxsize)
  File "C:\Anaconda3\lib\multiprocessing\connection.py", line 337, in _get_more_data
    assert left > 0
AssertionError
Process SpawnPoolWorker-8:
Traceback (most recent call last):
  File "C:\Anaconda3\lib\multiprocessing\process.py", line 254, in _bootstrap
    self.run()
  File "C:\Anaconda3\lib\multiprocessing\process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Anaconda3\lib\multiprocessing\pool.py", line 108, in worker
    task = get()
  File "C:\Anaconda3\lib\multiprocessing\queues.py", line 355, in get
    res = self._reader.recv_bytes()
  File "C:\Anaconda3\lib\multiprocessing\connection.py", line 216, in recv_bytes
    buf = self._recv_bytes(maxlength)
  File "C:\Anaconda3\lib\multiprocessing\connection.py", line 318, in _recv_bytes
    return self._get_more_data(ov, maxsize)
  File "C:\Anaconda3\lib\multiprocessing\connection.py", line 337, in _get_more_data
    assert left > 0
AssertionError
Traceback (most recent call last):
  File "test.py", line 41, in <module>
    ans = t.top_level_function(4)
  File "test.py", line 21, in top_level_function
    sums = [pp.get() for pp in sums]
  File "test.py", line 21, in <listcomp>
    sums = [pp.get() for pp in sums]
  File "C:\Anaconda3\lib\multiprocessing\pool.py", line 599, in get
    raise self._value
  File "C:\Anaconda3\lib\multiprocessing\pool.py", line 383, in _handle_tasks
    put(task)
  File "C:\Anaconda3\lib\multiprocessing\connection.py", line 206, in send
    self._send_bytes(ForkingPickler.dumps(obj))
  File "C:\Anaconda3\lib\multiprocessing\connection.py", line 280, in _send_bytes
    ov, err = _winapi.WriteFile(self._handle, buf, overlapped=True)
OSError: [WinError 87] The parameter is incorrect
10
4核多处理
10
10
4核多处理
过程2-6:
回溯(最近一次呼叫最后一次):
文件“C:\Anaconda3\lib\multiprocessing\process.py”,第254行,在_bootstrap中
self.run()
文件“C:\Anaconda3\lib\multiprocessing\process.py”,第93行,正在运行
自我目标(*自我参数,**自我参数)
文件“C:\Anaconda3\lib\multiprocessing\pool.py”,第108行,在worker中
task=get()
get中第355行的文件“C:\Anaconda3\lib\multiprocessing\queues.py”
res=self.\u reader.recv\u bytes()
文件“C:\Anaconda3\lib\multiprocessing\connection.py”,第216行,recv_字节
buf=自身接收字节(最大长度)
文件“C:\Anaconda3\lib\multiprocessing\connection.py”,第318行,以字节为单位
返回自我。获取更多数据(ov,maxsize)
文件“C:\Anaconda3\lib\multiprocessing\connection.py”,第337行,在获取更多数据中
断言左>0
断言错误
处理工人-8:
回溯(最近一次呼叫最后一次):
文件“C:\Anaconda3\lib\multiprocessing\process.py”,第254行,在_bootstrap中
self.run()
文件“C:\Anaconda3\lib\multiprocessing\process.py”,第93行,正在运行
自我目标(*自我参数,**自我参数)
文件“C:\Anaconda3\lib\multiprocessing\pool.py”,第108行,在worker中
task=get()
get中第355行的文件“C:\Anaconda3\lib\multiprocessing\queues.py”
res=self.\u reader.recv\u bytes()
文件“C:\Anaconda3\lib\multiprocessing\connection.py”,第216行,recv_字节
buf=自身接收字节(最大长度)
文件“C:\Anaconda3\lib\multiprocessing\connection.py”,第318行,以字节为单位
返回自我。获取更多数据(ov,maxsize)
文件“C:\Anaconda3\lib\multiprocessing\connection.py”,第337行,在获取更多数据中
断言左>0
断言错误
回溯(最近一次呼叫最后一次):
文件“test.py”,第41行,在
ans=t.顶层功能(4)
文件“test.py”,第21行,在顶级函数中
SUMMS=[pp.get()表示pp的SUMMS]
文件“test.py”,第21行,在
SUMMS=[pp.get()表示pp的SUMMS]
get中第599行的文件“C:\Anaconda3\lib\multiprocessing\pool.py”
提升自我价值
文件“C:\Anaconda3\lib\multiprocessing\pool.py”,第383行,在\u handle\u tasks中
放置(任务)
文件“C:\Anaconda3\lib\multiprocessing\connection.py”,第206行,在send中
self.\u发送字节(ForkingPickler.dumps(obj))
文件“C:\Anaconda3\lib\multiprocessing\connection.py”,第280行,以字节为单位
ov,err=\u winapi.WriteFile(self.\u handle,buf,overlapped=True)
OSError:[WinError 87]参数不正确
因此,第一个示例运行良好,但后一个示例(更大的数据集)崩溃

我对这个错误是从哪里来的以及如何修复它感到非常困惑。如果您有任何帮助,我们将不胜感激。

sums = [p.apply_async(self._sub_function) for i in range(10)]
发生的情况是,
self.\u sub_函数
将被pickle 10次并发送到工作进程进行处理。要pickle实例方法,必须pickle整个实例(包括
data
属性)。快速检查显示,
np.zero((12620482048))
当pickle需要4227858596字节时,您将向10个不同的进程发送10倍的字节

您在
\u send_bytes
过程中遇到错误,这意味着到工作进程的传输被中断,我猜可能是因为您达到了内存限制


您可能应该重新考虑您的设计,如果每个工作人员都可以处理问题的一部分,而不需要访问整个数据,那么多处理通常效果最好。

仅需确认,第一个(
t=TestClass(np.zeros((126512512)))
)工作正常,而第二个(
t=TestClass(np.zeros((12620482048))
)导致您描述的错误?正如mata所解释的,您可能在进程之间发送了太多数据。每个进程可能都应该自己加载数据,进行尽可能多的合理处理,并返回某种小规模的结果。基本上最小化进程之间发送的数据量。如果你能解释更多关于数据输入、中间产物、函数和输出的信息,那么有人可能会建议更好的安排。同意这一点。这:
winapi.WriteFile(self.\u handle,buf,overlapped=True)
产生windows错误看起来windows在某些IO上呕吐,这是一个很大的问题。