我有时编写Python程序,在执行之前很难确定它将使用多少内存.因此,我有时会调用一个Python程序,试图分配大量RAM,导致内核严重交换,并降低其他正在运行的进程的性能.

因此,我希望限制Python堆可以增加多少内存.当达到极限时,程序可能会崩溃.最好的方法是什么?

如果重要的话,很多代码都是用Cython编写的,所以它应该考虑分配给Cython的内存.我没有嫁给一个纯粹的Python解决方案(它不需要是可移植的),所以在Linux上工作的任何东西都可以.

推荐答案

看看resource.setrlimit().它只在Unix系统上工作,但它似乎可能是您想要的,因为您可以使用资源为您的进程和进程的子进程 Select 最大堆大小.RLIMIT_数据参数.

编辑:添加示例:

import resource

rsrc = resource.RLIMIT_DATA
soft, hard = resource.getrlimit(rsrc)
print 'Soft limit starts as  :', soft

resource.setrlimit(rsrc, (1024, hard)) #limit to one kilobyte

soft, hard = resource.getrlimit(rsrc)
print 'Soft limit changed to :', soft

我不确定你的用例到底是什么,但你可能需要用Resource来限制堆栈的大小.RLIMIT_STACK.超过此限制将向进程发送一个SIGSEGV信号,要处理它,需要使用setrlimit Linux manpage中描述的备用信号堆栈.不过,我不确定sigaltstack是否是用python实现的,所以如果您想从跨越这个界限的情况中恢复过来,这可能会很困难.

Linux相关问答推荐

获取Perl文件::Tail开始在最后流传输文件

通过添加1位数字替换最后4位数字(不包括0x)

在不影响ROS2安装的情况下更新Ubuntu Linux中的CMake

奇怪的 Bash 脚本行为

Linux BlueZ 5.65 hcitool 结合服务 UUID 和制造数据广告

使用ansible配置Linux VM使用vmware_vm_shell模块时变成su?

最小的 x86_64 Hello World ELF 二进制文件是什么?

使用 bash 中的数字对 RPM 内核字符串进行版本排序返回不正确的结果

如何在 Linux 中设置目录大小限制?

分段故障处理

低功耗蓝牙:在 linux 中监听通知/指示

如何从 Linux 中的用户空间访问物理地址?

如何查看安装的 pip 包大小?

'&&' 与 '&' 与 Bash 中的 'test' 命令

CLOCK_MONOTONIC 和 CLOCK_MONOTONIC_RAW 有什么区别?

如何在 Linux 上查找不包含文本的文本文件?

linux中netstat和ss的区别?

如何在 Linux 中查看日志(log)文件并在查看时应用自定义过滤器?

从文件中随机 Select 行而不用 Unix 啜饮它

在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403