2015-05-07 91 views
3

我正在從數據庫中檢索大量數據,我稍後使用散點圖進行繪圖。但是,我用完了內存,當我使用完整數據時程序中止。爲了記錄,運行該程序需要大於30分鐘,數據列表的長度大約爲20-30百萬。當繪圖時內存不足,Python

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

只是出於好奇,len(data)的輸出是什麼? –

+0

目前我無法給出準確的答案,因爲它正在運行,但我估計它是大約24-30萬美元。 @nivixzixer – bjornasm

+1

O.O在這種情況下,你可以嘗試「流」數據?一次處理幾百個繪圖點,直到您看到完整的圖像,而不是將所有3000萬個內存加載到內存中? –

回答

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()調用中。這會將結果保存爲位圖內的位圖(請參閱文檔here

如果這一切都無濟於事,我將通過註釋掉後面的行來進一步調查。也就是說,首先註釋掉plt.savefig('Plot.png')並查看內存使用是否下降。如果沒有,在此之前註釋掉該行,等等。