Подтвердить что ты не робот

IronPython throw InsufficientMemoryException при использовании numpy в потоках

У меня есть код IronPython, вызываемый из приложения C#.
Этот код работал нормально, пока я решил изменить одну функцию для запуска в потоке.
когда функции numpy, вызываемые в потоке python, генерируются исключение InsufficientMemoryException.
Я искал решения, но не нашел. может кто-нибудь объяснить, почему это происходит и как я могу это исправить?

Я думаю, что это происходит только тогда, когда у меня есть два потока, которые используют numpy

Я запускаю код следующим образом:

С#

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

И я получил это исключение:

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.

Спасибо

ОБНОВЛЕНИЕ 13/07/14

Я получаю это исключение, даже когда я запускаю только один поток и через интерпретатор IronPython без С#:

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.
4b9b3361

Ответ 1

Я считаю, что numpy не является потокобезопасным. У меня была аналогичная проблема, когда использование np.asarray() с потоковой обработкой приводило к сбою моей программы. Похоже, что способ создания numpy array для сборки массива не является потокобезопасным. Кстати, я нашел вместо этого np.fromiter(). По-видимому, это поточно-безопасный. Он немного медленнее, что делает, поскольку, если он не использует потоки, но он работает. Попытайтесь поместить свои данные в список (или какую-либо другую итерируемую структуру данных) и используя np.fromiter(), чтобы преобразовать его в массив numpy.

Кроме того, вы знаете, на самом деле он отлично работает на моем компьютере, поэтому может быть просто, что у вас недостаточно памяти для обработки потоков (или, по крайней мере, при использовании numpy).