Python绘图时运行内存不足

时间:2015-05-07 18:09:12

标签: python memory plot

我正在从数据库中检索大量数据,稍后我将使用散点图进行绘制。但是,我的内存不足,程序在我使用完整数据时中止。仅仅为了记录,运行该程序需要大约30分钟,数据列表的长度大约为2千万至3千万。

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(*)函数中,但我真的不知道。我对如何通过重写现有代码以及分割绘图过程来保留更多内存感兴趣。我的想法是将时间段分成两半,然后在保存数字之前两次同时做两次同样的事情,但是我不确定这对我有帮助。如果问题是要实际绘制它,我不知道。

1 个答案:

答案 0 :(得分:2)

如果您认为问题出在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')并查看内存使用是否下降。如果没有,请在此之前注释掉,等等。