【发布时间】: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