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

10
我有一些使用IronPython编写的代码,该代码从C#应用程序中调用。
这段代码在我决定将其中一个函数改为在线程中运行之前,运行良好。
当在Python线程中调用numpy函数时,会抛出一个InsufficientMemoryException异常。
我寻找了解决方案,但没有找到。能否有人解释一下为什么会发生这种情况,以及如何解决?

我认为只有在有两个使用numpy的线程时才会出现这种情况。

我运行以下代码:

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)

我遇到了这个异常:

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:\>"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.

你有多少个处理器? - o-90
我现在不确定,因为它在我的工作电脑上。但我相信它至少是双核的,也许是四核的。但这对于重要性有何影响呢? - Elisha
你可以阅读这篇文章这篇文章,看看是否能解决你的问题。 - o-90
四核心,但这并没有解决问题 :( - Elisha
@ilmarinen 我使用不同的版本。https://pytools.codeplex.com/wikipage?title=NumPy%20and%20SciPy%20for%20.Net - Elisha
显示剩余3条评论
1个回答

2
我认为numpy不是线程安全的。我曾经遇到过类似的问题,使用np.asarray()和线程一起使用会导致程序崩溃。似乎numpy的array函数构建数组的方式不是线程安全的。我发现解决方法是使用np.fromiter()代替。显然,它是线程安全的。它稍微慢一些,这是因为它没有使用线程,但它可以工作。尝试将数据放入列表(或其他可迭代的数据结构)中,并使用np.fromiter()将其转换为numpy数组。
另外,只是让你知道,在我的电脑上它实际上运行得很好,所以可能只是因为你没有足够的内存来处理线程(或者至少在使用numpy时不行)。

我期望得到这个问题的解决方案,而不是权宜之计,所以我暂时不接受这个答案(也许后面会有更好的解决方案)。然而,也有可能没有更好的解决方案,你的答案目前是最好的,所以你获得了赏金。 - Elisha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接