【发布时间】:2014-07-31 11:38:28
【问题描述】:
我在 Mac 上编写了一个程序,但由于 RAM 不足 (MemoryError) 而无法在我的 Raspberry Pi 上运行。
程序的本质是一些图像处理,它将一个 640x480 的 uint8 与一个两倍大小的 complex128 进行卷积。
我认为内存使用情况是: 初始图像:
640 x 480 x 8 bits / 8 bits / 1024 bytes = 300 kb
复矩阵:
640 x 480 x 2^2 x 128 bits / 8 bits / 1024^2 = 18.75 MB
让我们假设它必须在内存中保存这些不同矩阵的两到三个副本 - 应该是一个相当小的占用空间 - 可能
- 我的分析正确吗?
- 关于如何在 Python 中更好地管理内存的任何提示?
更新:
如下所示,我做了一些内存分析,确实是 fftconvolve 使 RAM 使用率达到峰值,如下:
Line # Mem 使用增量行内容
65 86.121 MiB 0.000 MiB @profile
66 def iriscode(self):
67 86.121 MiB 0.000 MiB img = self.polar
68
69 86.379 MiB 0.258 MiB pupil_curve = find_max(img[0:40])
70 86.379 MiB 0.000 MiB blur = cv2.GaussianBlur(self.polar, (9, 9), 0)
71 76.137 MiB -10.242 MiB iris_fft = fit_iris_fft(radial_diff(blur[50:,:])) + 50
72
73 76.160 MiB 0.023 MiB img = warp(img, iris_fft, pupil_curve)
74 # cv2.imshow("mask",np.uint8(ma.getmaskarray(img))*255)
75
76 global GABOR_FILTER
77 262.898 MiB 186.738 MiB output = signal.fftconvolve(GABOR_FILTER, img, mode="valid")
不过,这种增长的幅度让我感到惊讶。任何想法我可以做些什么来减少它?我尝试使用complex64 而不是complex128,但内存使用量是一样的。
【问题讨论】:
-
您的计算看起来正确,但您似乎做了很多假设而不是测试。你是如何进行卷积的?你在用
scipy.signal.convolve2d吗?我不知道 numpy 2d 卷积函数。 -
scipy.signal.fftconvolve
-
这是一个非常广泛的问题。显示一些代码,最好是一些分析; memory_profiler 专为 NumPy 繁重的程序而设计。
-
感谢 larsmans- 我已经根据您的建议更新了问题
标签: python python-2.7 numpy scipy