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:
我的數據進行編碼等與上面的鏈接,但獨立的:
我收到與上面相同的錯誤。我使用的是2GB RAM的英特爾酷睿2雙核筆記本電腦。讀取x和寫入xo的組合僅爲〜53MB,但內存使用率遠遠超出了循環進度所需的範圍。
您如何測量內存消耗? Python可能不會釋放所有內存,但會將其保留在內部緩存中以便更快地重新分配。 –
我使用OSX上的活動監視器跟蹤上述情況。有沒有辦法從這個內部緩存釋放內存?我在循環中經常運行類似上面的東西,積累導致崩潰。 –
啊,這是一種不同的情況。在這種情況下,Python不應該累積內存。儘管如此,活動監視器並不是分析Python內存的好方法。看看這個帖子的優越方式:http://stackoverflow.com/questions/552744/how-do-i-profile-memory-usage-in-python –