Rpy2,DiceKriging,多处理:内存泄漏

时间:2014-08-28 08:51:19

标签: python r memory-leaks multiprocessing rpy2

为了使用Python中的R包DiceKriging进行多处理,我写了类似下面的例子。

多处理允许显着的时间增益,但具有快速增加内存消耗的意外副作用。 在以下代码中设置flag_pool = False时(因此不使用多处理),内存稳定。

我尝试使用Python和R垃圾收集器(建议herehere,  和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应该更容易运行。

0 个答案:

没有答案