Rpy2, DiceKriging, Multiprocessing: Speicherleck

Um das R-Paket DiceKriging von Python mit Multiprocessing zu verwenden, habe ich so etwas wie das folgende Beispiel geschrieben.

Multiprocessing ermöglicht einen signifikanten Gewinn in der Zeit, hat aber die unerwartete Nebenwirkung der schnell zunehmenden Speicherverbrauch. Bei der Einstellung von flag_pool = False im folgenden Code (also nicht mit Multiprocessing) ist der Speicher stabil.

Ich habe versucht, sowohl Python- als auch R-Müllsammler (wie hier vorgeschlagen, hier und da ) ohne Erfolg zu verwenden.

Wie könnte das vermieden werden?

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) # 

Bearbeiten: Ich benutze ubuntu 12.04.4, python 2.7.3, R 2.14.1 und rpy2 2.2.5.

Ich habe eine ähnliche Frage hier mit einer MWE gefragt, die leichter laufen soll.

  • Wie installiere ich die Behandlung unter python 2.7?
  • Python-Gedächtnisleck
  • Ist die Freisetzung anders für kleine / große numpy Arrays?
  • Gedächtnisgebrauch, wie man Gedächtnis freigibt
  • Finden Sie alle Verweise auf ein Objekt in Python
  • Riesiges Gedächtnisleck in wiederholten os.path.isdir ruft?
  • Wie finde ich die Quelle der zunehmenden Speicherverbrauch eines verdrehten Servers?
  • Python - Gedächtnis wird nicht an den Kernel zurückgegeben
  • Speicherleck beim Ausführen von Python im Mac OS Terminal
  • NDB nicht löschen Speicher während einer langen Anfrage
  • Speicherverlust bei Verwendung von Strings <128KB in Python?
  • Python ist die beste Programmiersprache der Welt.