在线程中使用numpy时,IronPython会抛出InsufficientMemoryException

Eli*_*sha 10 c# python multithreading ironpython numpy

我有一些IronPythonC#应用程序中调用的代码.
这段代码工作正常,直到我决定更改一个函数在一个线程中运行.
当在python线程中调用numpy函数时,InsufficientMemoryException抛出异常.
我搜索了解决方案,但没有找到.有人可以解释为什么会发生这种情况,我该如何解决?

我认为只有当我有两个线程使用时才会发生这种情况 numpy

我运行这样的代码:

C#:

_python.functionA(); # _python was created with "Python.CreateEngine()"
_python.functionA(); # twice on purpose
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

我得到了这个例外:

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.
Run Code Online (Sandbox Code Playgroud)

谢谢

更新 13/07/14

即使我只运行一个线程并通过IronPython解释器而没有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.
Run Code Online (Sandbox Code Playgroud)

SFB*_*A26 2

我相信 numpy 不是线程安全的。我遇到了类似的问题,使用np.asarray()线程会使我的程序崩溃。arraynumpy的函数构建数组的方式似乎不是线程安全的。我发现解决这个问题的方法是使用np.fromiter()。显然,它是线程安全的。它稍微慢一些,这使得如果它不使用线程,但它可以工作。尝试将数据放入列表(或其他一些可迭代的数据结构)中,并使用np.fromiter()将其转换为 numpy 数组。

另外,正如您所知,它实际上在我的计算机上运行良好,因此可能只是您没有足够的内存来处理线程(或者至少在使用 numpy 时没有)。