c# - IronPython 在线程中使用 numpy 时抛出 InsufficientMemoryException

标签 c# python multithreading numpy ironpython

我有一些从 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)

我得到了这个异常:

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.

谢谢

更新 2014 年 7 月 13 日

即使我只运行一个线程并通过 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 时没有)。

关于c# - IronPython 在线程中使用 numpy 时抛出 InsufficientMemoryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24657779/

相关文章:

c# - 如何在ServiceBus上通过sequenceNumber使用MessageReceiver.Receive方法

python - 以行为条件选择 DataFrame 中的列

java - Java中线程完成时关闭资源

c++ - 在线程 A 中创建对象,在线程 B 中使用。需要互斥锁吗?

c# - 如何定义返回派生类类型实例的泛型方法?

c# - 模型更改更新 View-Model WPF

python - 我想用 Python 为基于桌面的应用程序开发一个框架。我该怎么办?

python - 在 Pandas 中重新索引和填充 NaN 值

c++ - 写入数组时,最后一个线程比第一个线程执行得慢

c# - 分析 C# 和 mscorlib.ni.dll