【问题标题】:How to limit memory usage within a python process如何限制python进程中的内存使用
【发布时间】:2015-07-27 22:52:02
【问题描述】:

我在具有 16GB 内存和 64 位操作系统的 Linux 机器上运行 Python 2.7。我编写的 python 脚本可能会将过多的数据加载到内存中,这会使机器速度减慢到我什至无法终止进程的地步。

虽然我可以通过调用来限制内存:

ulimit -v 12000000

在我的 shell 中运行脚本之前,我想在脚本本身中包含一个限制选项。在我所见的任何地方,resource 模块都被引用为与ulimit 具有相同的功能。但是调用:

import resource
_, hard = resource.getrlimit(resource.RLIMIT_DATA)
resource.setrlimit(resource.RLIMIT_DATA, (12000, hard))

在我的脚本的开头绝对没有做任何事情。即使将值设置为 12000 也不会导致进程崩溃。我对RLIMIT_STACK 进行了同样的尝试,结果也一样。奇怪的是,调用:

import subprocess
subprocess.call('ulimit -v 12000', shell=True)

什么也不做。

我做错了什么?我在网上找不到任何实际使用示例。


编辑:对于任何好奇的人,使用subprocess.call 是行不通的,因为它会创建一个(惊喜,惊喜!)新进程,该进程独立于当前运行 python 程序的进程。

【问题讨论】:

  • 是否有空间让程序更节省内存?
  • 有,但这需要一段时间。目前,我需要对其进行测试并确保它不会关闭计算机。并且为内存设置故障保护在以后也会很有用。
  • 既然是 Python 2.7,那么切换到 Python 3 并在程序中使用 2 到 3 转换器怎么样?与 Python 2 相比,Python 3 有多项性能改进,其中一些与内存相关。
  • 我会这样做——但在这一点上,我只是好奇限制内存是否或如何在 python 中起作用。
  • 这个问题一直出现在交互式数据分析中——你加载一个大数组(比如,8GB)并开始你的工作。然后您无意中对数组进行了平方(代码中的错字,或对 API 的误解等),现在脚本请求 64 GB 并且系统冻结。 :P 你宁愿杀死进程也不愿重新启动计算机。

标签: python linux memory ulimit


【解决方案1】:

resource.RLIMIT_VMEM 是资源corresponding to ulimit -v

RLIMIT_DATAonly affects brk/sbrk system callsnewer memory managers tend to use mmap instead

需要注意的第二点是ulimit/setrlimit只影响当前进程及其未来的子进程。

关于AttributeError: 'module' object has no attribute 'RLIMIT_VMEM' 消息:resource module docs 提到这种可能性:

这个模块不会试图掩盖平台差异——符号 未为平台定义将无法从此模块中使用 那个平台。

根据上面链接的bash ulimit source,如果未定义RLIMIT_VMEM,则使用RLIMIT_AS

【讨论】:

  • 我不使用多线程,所以我希望这不是问题。但是当我输入RLIMIT_DATA 时,我收到以下错误消息:Traceback (most recent call last): File "my_script.py", line 417, in <module> sys.exit(main()) File "my_script.py", line 391, in main _, hard = resource.getrlimit(resource.RLIMIT_VMEM) AttributeError: 'module' object has no attribute 'RLIMIT_VMEM' 从您引用的列表中,可以找到所有字段——除了这个。我现在正在尝试用 Python 3.x 运行它..
猜你喜欢
  • 2023-04-05
  • 2014-08-05
  • 2011-06-18
  • 1970-01-01
  • 2011-06-06
  • 2015-12-11
  • 1970-01-01
  • 2011-01-24
  • 2017-05-21
相关资源
最近更新 更多