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时).

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString("x2"));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable<Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include "WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...