python多处理池malloc错误
我是python并行编程新手。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中的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模块中是否存在一些底层数据共享的可能性?然而,我认为对于多处理模块,所有进程都应该有自己的特定变量内存。如果我错了,请澄清。