绘图时内存不足,Python

Runs out of memory when plotting, Python

我正在从数据库中检索大量数据,稍后我使用散点图绘制这些数据。但是,我 运行 内存不足,当我使用全部数据时程序中止。仅作记录运行此程序耗时>30分钟,数据列表长度约为20-3000万。

map = Basemap(projection='merc',
resolution = 'c', area_thresh = 10,
llcrnrlon=-180, llcrnrlat=-75,
urcrnrlon=180, urcrnrlat=82)

map.drawcoastlines(color='black')
# map.fillcontinents(color='#27ae60')
with lite.connect('database.db') as con:
    start = 1406851200
    end = 1409529600
    cur = con.cursor()
    cur.execute('SELECT latitude, longitude FROM plot WHERE unixtime >= {start} AND unixtime < {end}'.format(start = start, end = end))
    data = cur.fetchall()
    y,x = zip(*data)
    x,y = map(x,y)
    plt.scatter(x,y, s=0.05, alpha=0.7, color="#e74c3c", edgecolors='none')
    plt.savefig('Plot.pdf')
    plt.savefig('Plot.png')

我想我的问题可能出在 zip(*) 函数上,但我真的没有头绪。我对如何通过重写现有代码来保留更多内存以及拆分绘图过程都很感兴趣。我的想法是将时间段分成两半,然后在保存数字之前对两个时间段做同样的事情两次,但是我不确定这是否对我有帮助。如果问题是实际绘制它,我不知道。

如果您认为问题出在 zip 函数上,为什么不使用 matplotlib 数组将您的数据转换为正确的格式呢?像这样:

data = numpy.array(cur.fetchall())
lat = data[:,0]
lon = data[:,1]
x,y = map(lon, lat)

此外,您生成的 PDF 将非常大,并且在各种 PDF 阅读器中呈现速度很慢,因为默认情况下它是矢量化格式。您所有的数百万个数据点都将存储为浮点数,并在用户打开文档时呈现。我建议您将 rasterized=True 参数添加到 plt.scatter() 调用中。这会将结果保存为 PDF 中的位图(请参阅文档 here

如果这一切都没有帮助,我会通过注释掉从后面开始的行来进一步调查。也就是先把plt.savefig('Plot.png')注释掉,看看内存占用是不是下降了。如果没有,把前面那行注释掉等等