2014-03-18 58 views
2

我從內插模塊使用scipy的LinearNDInterpolator,並且我失去了某處的內存。如果有人能告訴我如何恢復它,那將是非常好的。我在做類似下面的(在那裏我已經跟蹤上側的內存使用):恢復內存scipy插值

import numpy as np 
from scipy import interpolate as irp # mem: 14.7 MB 

X = np.random.random_sample((2**18,2)) # mem: 18.7 MB 
Y = np.random.random_sample((2**18,1)) # mem: 20.7 MB 
f = irp.LinearNDInterpolator(X, Y) # mem: 85.9 MB 
del f # mem: 57.9 MB 

我做插值要小得多,但導致最終崩潰了很多次。任何人都可以說這個額外的內存在哪裏,以及我如何恢復它?

編輯1:

輸出的 memory_profiler

Line # Mem usage Increment Line Contents 
================================================ 
4 15.684 MiB 0.000 MiB @profile 
5        def wrapper(): 
6 19.684 MiB 4.000 MiB  X = np.random.random_sample((2**18,2)) 
7 21.684 MiB 2.000 MiB  Y = np.random.random_sample((2**18,1)) 
8 86.699 MiB 65.016 MiB  f = irp.LinearNDInterpolator(X, Y) 
9 58.703 MiB -27.996 MiB  del f 

編輯2:

我跑的實際代碼如下。每個xtr是(2 * w^2,w^2)uint8。它一直運行到w = 61,但是隻有當我分別運行每個w(所以r_ [21] ... r_ [51]並且每個運行時)。奇怪的是,每個小於61的人仍然記憶所有的記憶,但直到61歲才記憶猶新。

from numpy import * 
from scipy import interpolate as irp 

for w in r_[ 21:72:10 ]: 
    print w 
    t = linspace(-1,1,w) 
    xx,yy = meshgrid(t,t) 
    xx,yy = xx.flatten(), yy.flatten() 
    P = c_[sign(xx)*abs(xx)**0.65, sign(yy)*abs(yy)**0.65] 
    del t 

    x = load('../../windows/%d/raw/xtr.npy'%w) 
    xo = zeros(x.shape,dtype=uint8) 
    for i in range(x.shape[0]): 
     f = irp.LinearNDInterpolator(P, x[i,:]) 
     out = f(xx, yy) 
     xo[i,:] = out 
     del f, out 

    save('../../windows/%d/lens/xtr.npy'%w,xo) 
    del x, xo 

61它錯誤此消息:

Python(10783) malloc: *** mmap(size=16777216) failed (error code=12) 
*** error: can't allocate region 
*** set a breakpoint in malloc_error_break to debug 
Traceback (most recent call last): 
File "make_lens.py", line 16, in <module> 
f = irp.LinearNDInterpolator(P, x[i,:]) 
File "interpnd.pyx", line 204, in scipy.interpolate.interpnd.LinearNDInterpolator.__init__ (scipy/interpolate/interpnd.c:3794) 
File "qhull.pyx", line 1703, in scipy.spatial.qhull.Delaunay.__init__ (scipy/spatial/qhull.c:13267) 
File "qhull.pyx", line 1432, in scipy.spatial.qhull._QhullUser.__init__ (scipy/spatial/qhull.c:11989) 
File "qhull.pyx", line 1712, in scipy.spatial.qhull.Delaunay._update (scipy/spatial/qhull.c:13470) 
File "qhull.pyx", line 526, in scipy.spatial.qhull._Qhull.get_simplex_facet_array (scipy/spatial/qhull.c:5453) 
File "qhull.pyx", line 594, in scipy.spatial.qhull._Qhull._get_simplex_facet_array (scipy/spatial/qhull.c:6010) 
MemoryError 

編輯3:

我的數據進行編碼等與上面的鏈接,但獨立的:

http://pastebin.com/BKYzVVTS

我收到與上面相同的錯誤。我使用的是2GB RAM的英特爾酷睿2雙核筆記本電腦。讀取x和寫入xo的組合僅爲〜53MB,但內存使用率遠遠超出了循環進度所需的範圍。

+0

您如何測量內存消耗? Python可能不會釋放所有內存,但會將其保留在內部緩存中以便更快地重新分配。 –

+0

我使用OSX上的活動監視器跟蹤上述情況。有沒有辦法從這個內部緩存釋放內存?我在循環中經常運行類似上面的東西,積累導致崩潰。 –

+0

啊,這是一種不同的情況。在這種情況下,Python不應該累積內存。儘管如此,活動監視器並不是分析Python內存的好方法。看看這個帖子的優越方式:http://stackoverflow.com/questions/552744/how-do-i-profile-memory-usage-in-python –

回答