Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
打印时内存不足,Python_Python_Memory_Plot - Fatal编程技术网

打印时内存不足,Python

打印时内存不足,Python,python,memory,plot,Python,Memory,Plot,我正在从数据库中检索大量数据,稍后我将使用散点图绘制这些数据。但是,内存不足,当我使用完整数据时,程序会中止。就记录而言,运行此程序需要>30分钟,数据列表的长度约为2000-3000万 map = Basemap(projection='merc', resolution = 'c', area_thresh = 10, llcrnrlon=-180, llcrnrlat=-75, urcrnrlon=180, urcrnrlat=82) map.drawcoastlines(color='

我正在从数据库中检索大量数据,稍后我将使用散点图绘制这些数据。但是,内存不足,当我使用完整数据时,程序会中止。就记录而言,运行此程序需要>30分钟,数据列表的长度约为2000-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中的位图。请参阅文档


如果这一切都没有帮助,我将通过注释从后面开始的行来进一步调查。也就是说,首先注释掉plt.savefig'Plot.png'并查看内存使用是否下降。如果没有,请注释掉前面的行,以此类推。

出于好奇,lendata?O.O的输出是什么?在这种情况下,您可以尝试流式传输数据?一次处理几百个绘图点,直到获得完整的图片,而不是将所有3000万点加载到内存中?数据库中是否有重复的lon、lat点?我发现基于matplotlib的解决方案非常慢,我更喜欢使用mapnik绘制地图,更快,有时更好。与其一次获得整个时间间隔,不如将其分解为一组更小的间隔,并将每个间隔一次添加到绘图中。您仍然会耗尽内存,但至少您可以在使用之前看到它正在走多远。