如何限制堆大小?
- 2024-10-21 09:14:00
- admin 原创
- 72
问题描述:
我有时会编写一些 Python 程序,这些程序在执行前很难确定会使用多少内存。因此,我有时会调用一个 Python 程序,该程序会尝试分配大量 RAM,导致内核大量交换并降低其他正在运行的进程的性能。
因此,我希望限制 Python 堆可以增长的内存量。达到限制后,程序就会崩溃。最好的方法是什么?
如果这很重要,那么很多代码都是用 Cython 编写的,因此应该考虑在那里分配的内存。我并不执着于纯 Python 解决方案(它不需要可移植),因此任何在 Linux 上运行的东西都可以。
解决方案 1:
查看resource.setrlimit()。它仅适用于 Unix 系统,但它似乎就是您正在寻找的,因为您可以使用 resource.RLIMIT_DATA 参数为您的进程及其子进程选择最大堆大小。
编辑:添加示例:
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
我不确定您的用例到底是什么,但您可能需要使用 resouce.RLIMIT_STACK 对堆栈大小进行限制。超过此限制将向您的进程发送 SIGSEGV 信号,要处理它,您需要使用 setrlimit Linux手册页中所述的备用信号堆栈。不过,我不确定 sigaltstack 是否在 python 中实现,因此如果您想从超过此边界后恢复,这可能会很困难。
解决方案 2:
看看ulimit。它允许设置资源配额。可能还需要适当的内核设置。
解决方案 3:
以下代码将内存分配给指定的最大驻留集大小
import resource
def set_memory_limit(memory_kilobytes):
# ru_maxrss: peak memory usage (bytes on OS X, kilobytes on Linux)
usage_kilobytes = lambda: resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
rlimit_increment = 1024 * 1024
resource.setrlimit(resource.RLIMIT_DATA, (rlimit_increment, resource.RLIM_INFINITY))
memory_hog = []
while usage_kilobytes() < memory_kilobytes:
try:
for x in range(100):
memory_hog.append('x' * 400)
except MemoryError as err:
rlimit = resource.getrlimit(resource.RLIMIT_DATA)[0] + rlimit_increment
resource.setrlimit(resource.RLIMIT_DATA, (rlimit, resource.RLIM_INFINITY))
set_memory_limit(50 * 1024) # 50 mb
在 Linux 机器上测试。
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD