为了使用R包DiceKriging从Python程序多,我写的东西像下面的例子。
多重允许在时间显著增益,但内存消耗快速增长的意想不到的副作用。 当设置flag_pool = False
在下面的代码(因此不使用多处理)的存储器是稳定的。
我试着使用Python的都和R的垃圾收集器(如建议在这里 , 在这里和那里 ),但没有成功。
这怎么可能避免?
MWE:
from multiprocessing import Pool
import numpy as np
from rpy2 import robjects
robjects.r("library('DiceKriging')")
# Generate data
def model_to_emulate(X):
return X[:, 0]**3 - X[:, 1]**2
X = np.random.random_sample((1000, 2))
z = model_to_emulate(X)
list_arg = [[z, X]] * N_gp
# Emulation
flag_pool = True
N_gp = 3
N_repetition = 3
def worker_km(response_design):
response = response_design[0]
robjects.globalenv["response"] = robjects.FloatVector(response)
design = response_design[1]
df = robjects.r["data.frame"]([robjects.FloatVector(column) for column in
design.T])
df.names = ["x%d" % ii for ii in xrange(design.shape[1])]
robjects.globalenv["design"] = df
return robjects.r("fit = km(design=design, response=response,"
"covtype='matern5_2')")
for _ in xrange(N_repetition):
if flag_pool:
print "==================== Using Pool."
pool = Pool(N_gp)
out = pool.map(worker_km, list_arg)
pool.close()
pool.join()
else:
print ">>>>>>>>>>>>>>>>>>>> Not using Pool."
for response_design in list_arg:
out = worker_km(response_design)
#
编辑:我使用Ubuntu 12.04.4,蟒蛇2.7.3,R 2.14.1和rpy2 2.2.5。
我问过类似的问题, 这里有MWE,应该是更容易地运行。