c# – IronPython在线程中使用numpy时抛出InsufficientMemoryException异常

前端之家收集整理的这篇文章主要介绍了c# – IronPython在线程中使用numpy时抛出InsufficientMemoryException异常前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一些从C#应用程序中调用的Iron Python代码.
这段代码工作正常,直到我决定更改一个函数来运行在一个线程中.
当在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,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",**self.kwargs)
  File "c:\workspace\my_python_script.py",line 6,0])
MemoryError: Exception of type 'System.InsufficientMemoryException' was thrown.

解决方法

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

此外,只是这样你知道,它实际上运行在我的电脑上,所以它可能只是你没有足够的内存来处理线程(或至少不使用numpy时).

猜你在找的C#相关文章