【发布时间】:2011-05-24 08:05:34
【问题描述】:
问题:
我目前正在将文本文件中的列数据加载到 numpy 数组中,然后绘制它们并保存生成的图像。因为这些值总是位于等间距的网格上,所以似乎是使用 pcolorfast 的合适时机。每个数组都必须是正方形的,通常在 1024x1024 和 8192x8192 之间。目前,我只关心 4096x4096 尺寸(包括 4096x4096 尺寸)。这需要为数百个文件完成,虽然它成功完成了第一个图像,但随后的图像在 MemoryError 上崩溃。
不成功的解决方案:
根据here,我已确保我在 rc 中持有 = False。
限制:
图像必须使用所有 4096x4096 值保存,并且不能缩小到 1024x1024(建议 here)。
注意事项:
在观察每个阶段的内存使用情况(创建空数组、加载值、绘图、保存)之后,数组 A 在 makeFrame 完成后仍然位于内存中。是否需要明确调用来删除它? fig 是否需要明确删除,还是应该由 pylab 处理?理想的情况(可能很明显)是让内存使用恢复到与调用 makeFrame() 之前相同的水平。
非常感谢任何和所有建议。几天来我一直在尝试解决这个问题,所以我不太可能错过了一些明显的东西。显而易见的解决方案会令人兴奋(如果替代方案应该是这是一个更复杂的问题)。
当前代码示例:
import numpy
import matplotlib
matplotlib.use("AGG")
import matplotlib.pylab as plt
def makeFrame(srcName, dstName, coloring, sideLength,
dataRanges, delim, dpi):
v,V,cmap = coloring
n = sideLength
xmin,xmax,ymin,ymax = dataRanges
A = numpy.empty((n,n),float)
dx = (xmax-xmin) / (n-1)
dy = (ymax-ymin) / (n-1)
srcfile = open(srcName,'rb')
for line in srcfile:
lineVals = line[:-1].split(delim)
x = float(lineVals[0])
y = float(lineVals[1])
c = float(lineVals[2])
#Find index from float value, adjust for rounding
i = (x-xmin) / dx
if (i - int(i) ) > .05: i += 1
j = (y-ymin) / dy
if (j - int(j) ) > .05: j += 1
A[i,j] = c
srcfile.close()
print "loaded vals"
fig = plt.figure(1)
fig.clf()
ax = fig.gca()
ScalarMap = ax.pcolorfast(A, vmin = v, vmax = V, cmap = cmap)
fig.colorbar(ScalarMap)
ax.axis('image')
fig.savefig(dstName, dpi = dpi)
plt.close(1)
print "saved image"
【问题讨论】:
标签: python arrays memory-management numpy matplotlib