2014-07-09 26 views
10

Ho un codice IronPython chiamato dall'interno di un'applicazione C#.
Questo codice ha funzionato correttamente finché non ho deciso di modificare una funzione per l'esecuzione in una discussione.
quando le funzioni di numpy richiamano in un thread python viene generata un'eccezione InsufficientMemoryException.
Ho cercato soluzioni ma non ho trovato. qualcuno può spiegare perché sta accadendo e come posso risolverlo?IronPython throw InsufficientMemoryException quando si utilizza numpy nei thread

penso che questo sta accadendo solo quando ho due thread che utilizzano numpy

corro codice come questo:

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) 

E ho avuto questa eccezione:

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. 

Grazie

UPDATE 13/07/14

ottengo questa eccezione, anche quando ho eseguito un solo thread e tramite l'interprete IronPython, senza 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

Quanti processori hai? – gobrewers14

+0

Non sono sicuro adesso, sul mio computer di lavoro. Ma credo che sia almeno doppio, forse quad. È importante come esattamente? – Elisha

+0

È possibile leggere [questo] (http://support.microsoft.com/kb/974065) e [questo] (http://msdn.microsoft.com/en-us/library/at1stbec.aspx) e vedere se che risolve il tuo problema. – gobrewers14

risposta

2

Credo che numpy non sia thread-safe. Ho avuto un problema simile in cui l'utilizzo di np.asarray() con il thread causava il crash del mio programma. Sembra che il modo in cui la funzione di numpy array crea l'array non sia thread-safe. Il modo in cui questo ho trovato è stato quello di utilizzare np.fromiter() invece. Apparentemente, è thread-safe. È leggermente più lento, il che lo rende poiché se non sta usando il threading, ma funziona. Prova a mettere i tuoi dati in una lista (o qualche altra struttura di dati iterabile) e usando np.fromiter() per convertirlo in una matrice numpy.

Inoltre, solo così sapete, in realtà funziona correttamente sul mio computer, quindi potrebbe essere solo che non avete abbastanza memoria per gestire il threading (o almeno non quando si utilizza Numpy).

+0

Mi aspettavo una soluzione a questo problema e non una soluzione alternativa, quindi non accetto ancora questa risposta (forse le soluzioni arriveranno più tardi). Tuttavia, potrebbe essere che non esiste una soluzione migliore e la tua risposta è la migliore finora, quindi hai ottenuto la taglia – Elisha

Problemi correlati