Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.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多处理池malloc错误_Python_Opencv_Multiprocessing_Pool - Fatal编程技术网

python多处理池malloc错误

python多处理池malloc错误,python,opencv,multiprocessing,pool,Python,Opencv,Multiprocessing,Pool,我是python并行编程新手。 我正在尝试使用python中的OpenCV从大量图像(~100000)中提取SIFT特征。这似乎是一个非常简单的并行化,非常类似于matlab中的parfor。我检查了python并行模块,发现多处理模块可能适合这种情况。因此,我尝试在多处理模块中使用Pool类。作为初始测试,我首先测试了总共900张图像。我的代码如下: import cv2 import numpy as np import glob import multiprocessing as mp

我是python并行编程新手。
我正在尝试使用python中的OpenCV从大量图像(~100000)中提取SIFT特征。这似乎是一个非常简单的并行化,非常类似于matlab中的parfor。我检查了python并行模块,发现多处理模块可能适合这种情况。因此,我尝试在多处理模块中使用Pool类。作为初始测试,我首先测试了总共900张图像。我的代码如下:

import cv2
import numpy as np
import glob
import multiprocessing as mp


def extract_SIFT(img_name):
    img = cv2.imread(img_name)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    #detect the SIFT keypoints and the descriptors.
    sift = cv2.SIFT()
    kp, des=sift.detectAndCompute(gray,None)

    return des

if __name__ == "__main__":    
    img_path = './images/'
    img_names = glob.glob(img_path + '*.jpg')
    pool = mp.Pool(processes=4)
    sift_features = pool.map(extract_SIFT, img_names) 
但是,在尝试运行该脚本后,我一直遇到以下错误:

Python(1692)malloc:**对象0x100f11000的错误:未分配要释放的指针

***在malloc\u error\u break中设置断点以进行调试

Python(1693)malloc:**对象0x100ed7e08的错误:已释放对象的校验和不正确-对象可能在被释放后被修改

***在malloc\u error\u break中设置断点以进行调试

Python(1690)malloc:**对象0x100ff6000的错误:未分配要释放的指针

***在malloc\u error\u break中设置断点以进行调试

Python(1699)malloc:**对象0x100cf4800的错误:双自由

***在malloc\u error\u break中设置断点以进行调试


我只列出了其中的一部分错误,但似乎都与Python malloc有关。谁能在这个问题上给我一些提示吗?谢谢。

您正在使用
pool.map处理100000张图像
您将在内存中获得所有结果的列表。你可能想改变这种行为。我明白了,你是对的。但是,我尝试了较少的图像,但仍然得到相同的错误。我将更新“我的问题”以使其更清楚。从错误消息中,一些数据可能会在进程之间共享。某些进程释放(解除分配)数据(内存区域),然后另一个进程释放相同的数据,“未分配被释放的指针”错误可能会发生。此处没有共享数据,除非他正在执行代码中未显示的其他操作。我发布的代码与我使用的代码完全相同。cv2模块中是否存在一些底层数据共享的可能性?然而,我认为对于多处理模块,所有进程都应该有自己的特定变量内存。如果我错了,请澄清。