2014-07-09 12 views
10

Ich habe einige IronPython Code, der aus einer C# Anwendung aufgerufen wird.
Dieser Code funktionierte gut, bis ich entschied, eine Funktion zu ändern, um in einem Thread zu laufen.
Wenn numpy Funktionen in einem Python-Thread aufgerufen werden, wird eine InsufficientMemoryException Ausnahme ausgelöst.
Ich suchte nach Lösungen, fand aber nicht. kann jemand erklären, warum es passiert und wie kann ich es beheben?IronPython werfen InsufficientMemoryException bei der Verwendung von numpy in Threads

Ich denke, dies nur geschieht, wenn ich zwei Threads, die numpy

verwende ich Code wie folgt auszuführen:

C#:

_python.functionA(); # _python was created with "Python.CreateEngine()" 
_python.functionA(); # twice on purpose 

Python:
my_python_script .py

import threading 
import time 
import numpy 

def blah():  
    print numpy.array([100,100,0]) 

def functionA(): 
    t = threading.Timer(0,blah)  
    t.start() 
    time.sleep(2) 

Und ich habe diese Ausnahme:

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "c:\Program Files\IronPython 2.7.1\Lib\threading.py", line 552, in _Thread__bootstrap_inner 
    self.run() 
    File "c:\Program Files\IronPython 2.7.1\Lib\threading.py", line 756, in run 
    self.function(*self.args, **self.kwargs) 
    File "C:\workspace\my_python_script.py", line 113, in blah 
    print numpy.array([100,100,0]) 
MemoryError: Exception of type 'System.InsufficientMemoryException' was thrown. 

Dank

UPDATE 13/07/14

Ich erhalte diese Ausnahme, auch wenn ich nur ein Thread laufen und über IronPython-Interpreter, ohne die C#:

C:\>"c:\Program Files\IronPython 2.7.1\ipy.exe" 
IronPython 2.7.1 (2.7.0.40) on .NET 4.0.30319.18063 
Type "help", "copyright", "credits" or "license" for more information. 
>>> execfile(r"c:\workspace\my_python_script.py") 
>>> functionA() 
>>> Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "c:\Program Files\IronPython 2.7.1\Lib\threading.py", line 552, in _Thread__bootstrap_inner 
    self.run() 
    File "c:\Program Files\IronPython 2.7.1\Lib\threading.py", line 756, in run 
    self.function(*self.args, **self.kwargs) 
    File "c:\workspace\my_python_script.py", line 6, in blah 
    print numpy.array([100,100,0]) 
MemoryError: Exception of type 'System.InsufficientMemoryException' was thrown. 
+0

Wie viele Prozessoren haben Sie? – gobrewers14

+0

Ich bin mir nicht sicher, jetzt auf meinem Arbeitscomputer. Aber ich glaube, es ist mindestens Dual, vielleicht Quad. Ist es wichtig wie genau? – Elisha

+0

Sie könnten lesen [this] (http://support.microsoft.com/kb/974065) und [dies] (http://msdn.microsoft.com/en-us/library/at1stbec.aspx) und sehen, ob Das behebt Ihr Problem. – gobrewers14

Antwort

2

Ich glaube, dass numpy nicht Thread-sicher ist. Ich hatte ein ähnliches Problem, wo die Verwendung von np.asarray() mit Threading mein Programm zum Absturz bringen würde. Es scheint, dass die Art und Weise, wie numpys -Funktion das Array erstellt, nicht Thread-sicher ist. Der Weg, den ich fand, war stattdessen np.fromiter() zu verwenden. Anscheinend ist es threadsicher. Es ist etwas langsamer, was das macht, wenn es kein Threading verwendet, aber es funktioniert. Versuchen Sie, Ihre Daten in eine Liste (oder eine andere iterierbare Datenstruktur) zu setzen und np.fromiter() zu verwenden, um sie in ein numpy Array zu konvertieren.

Auch, nur damit Sie wissen, es läuft tatsächlich gut auf meinem Computer, so könnte es nur sein, dass Sie nicht genug Speicher haben, um Threading (oder zumindest nicht bei der Verwendung von numpy) zu behandeln.

+0

Ich erwartete für eine Lösung für dieses Problem und keine Umgehung, so dass ich diese Antwort noch nicht akzeptiere (vielleicht werden Lösungen später kommen). Es könnte jedoch sein, dass es keine bessere Lösung gibt und deine Antwort ist die beste bisher, also hast du das Kopfgeld bekommen – Elisha

Verwandte Themen