代码之家  ›  专栏  ›  技术社区  ›  carl

如何限制堆大小?

  •  46
  • carl  · 技术社区  · 15 年前

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

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

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

    3 回复  |  直到 9 年前
        1
  •  51
  •   xitrium    15 年前

    退房 resource.setrlimit()

    编辑:添加示例:

    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\u堆栈。超过此限制将向进程发送SIGSEGV信号,要处理它,需要使用setrlimit Linux中描述的备用信号堆栈 manpage . 不过,我不确定sigaltstack是否是用python实现的,因此如果您想从跨越此边界的过程中恢复过来,这可能会很困难。

        2
  •  1
  •   SpliFF    15 年前

    看一看 ulimit

        3
  •  0
  •   Ariunbayar    7 年前

    下面的代码将内存分配给指定的 最大驻留集大小

    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