当前位置: 首页 > 面试题库 >

如何限制堆大小?

司寇旺
2023-03-14
问题内容

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

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

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


问题答案:

签出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中实现,因此如果您想越过这个边界来恢复,那可能会很难。



 类似资料:
  • 问题内容: 我在IE浏览器中遇到了一些客户端Javascript堆栈溢出问题,这是在第三方库中发生的,该库进行了一些函数调用,并且由于某些原因,它们有时仅由于IE栈限制低而在IE中制动。 然后,我编写了一个小的测试HTML,以测试某些浏览器的堆栈大小限制,并发现与运行Windows 7 OS,8Gb RAM的笔记本电脑上运行的FF 7或Chrome 14相比,IE8实际上具有较小的堆栈限制: 当值

  • 我明白了在递归中,每个递归调用是如何堆栈在堆栈上的;如果超过堆栈限制,则会出现堆栈溢出。那么为什么Python的返回一个数字;递归调用的最大深度? 这不是取决于我在递归函数中做了什么吗?还是以某种方式将变量保存在堆栈以外的其他地方?它是如何工作的?

  • partition/data只有15G,kafka日志文件夹是-/data/var/kafka/kafka-logs data/var/kafka/kafka-logs下的大多数文件夹大小为4K-40K 但两个文件夹的大小非常大--5G-7G,这导致/数据是100%

  • 问题内容: 进程的大小是否有限制?它是否仅取决于机器的性能?我想知道这一点,以限制对函数的递归调用的深度。 谢谢。 问题答案: 堆栈通常受资源限制的限制。您可以使用以下命令查看安装的默认设置: (这表明我的是8MB,这是巨大的)。 如果删除或增加该限制,您仍将无法使用计算机中的所有RAM作为堆栈- 堆栈从进程地址空间顶部附近的一点向下增长,并在某个时刻它将运行到您的代码,堆或已加载的库中。