加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – IronPython在线程中使用numpy时抛出InsufficientMemoryExc

发布时间:2020-12-15 06:28:42 所属栏目:百科 来源:网络整理
导读:我有一些从C#应用程序中调用的Iron Python代码. 这段代码工作正常,直到我决定更改一个函数来运行在一个线程中. 当在python线程中调用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 FilesIronPython 2.7.1Libthreading.py",line 552,in _Thread__bootstrap_inner
    self.run()
  File "c:Program FilesIronPython 2.7.1Libthreading.py",line 756,in run
    self.function(*self.args,**self.kwargs)
  File "C:workspacemy_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 FilesIronPython 2.7.1ipy.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:workspacemy_python_script.py")
>>> functionA()
>>> Exception in thread Thread-1:
Traceback (most recent call last):
  File "c:Program FilesIronPython 2.7.1Libthreading.py",**self.kwargs)
  File "c:workspacemy_python_script.py",line 6,0])
MemoryError: Exception of type 'System.InsufficientMemoryException' was thrown.

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读