为了使用Python中的R包DiceKriging进行多处理,我写了类似下面的例子。
多处理允许显着的时间增益,但具有快速增加内存消耗的意外副作用。
在以下代码中设置flag_pool = False
时(因此不使用多处理),内存稳定。
我尝试使用Python和R垃圾收集器(建议here,here, 和there)没有成功。
怎么可以避免这种情况?
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,python 2.7.3,R 2.14.1和rpy2 2.2.5。
我问了一个类似的问题here,其MWE应该更容易运行。