IronPython在线程中使用numpy时会抛出InsufficientMemoryException
本文关键字:InsufficientMemoryException numpy 线程 IronPython | 更新日期: 2023-09-27 18:12:05
我有一些从C#
应用程序中调用的IronPython
代码。
这段代码工作得很好,直到我决定改变一个函数在线程中运行。
当在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)
And I got this Exception:
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.
我认为numpy不是线程安全的。我有一个类似的问题,使用np.asarray()
线程会使我的程序崩溃。似乎numpy的array
函数构建数组的方式不是线程安全的。我发现解决这个问题的方法是使用np.fromiter()
。显然,它是线程安全的。它稍微慢一些,这使得如果它不使用线程,但它可以工作。尝试将数据放入列表(或其他可迭代的数据结构)中,并使用np.fromiter()
将其转换为numpy数组。
同时,正如你所知道的,它实际上在我的计算机上运行得很好,所以它可能只是你没有足够的内存来处理线程(或者至少在使用numpy时)。