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

Python多处理失控内存

  •  0
  • hobscrk777  · 技术社区  · 5 年前

    基本上,我有一个指向大型二进制对象的路径列表。我有一个用这个列表实例化的类。在这个班的 __iter__ 方法,我从磁盘读取文件并生成它。我的想法是迭代这个对象列表(将文件读入内存)并执行一些昂贵的操作。下面是一些模拟这个的示例代码。我正在使用 np.random.rand(100,100)

    import numpy as np
    from pathos.multiprocessing import ProcessingPool as Pool
    from memory_profiler import profile
    
    class MyClass:
        def __init__(self, my_list):
            self.name = 'foo'
            self.my_list = my_list
    
        def __iter__(self):
            for item in self.my_list:
                yield np.random.rand(100,100)
    
    def expensive_function(foo):
        foo[0,0]
    
    my_list = range(100000)
    myclass = MyClass(my_list)
    
    iter(myclass) # should not return anything
    
    p = Pool(processes=4, maxtasksperchild=50)
    p.map(expensive_function, iter(myclass), chunksize=100)
    

    enter image description here

    是什么导致了这种失控的内存使用,我该如何修复它?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Michael    5 年前

    每次子级开始调用 expensive_function ,它正在接收一个新的 np.random.rand(100,100) MyClass.__iter__ . 这些阵列在主进程中保持不变,因此内存使用当然会继续增长;子进程无法清理这些,它们存在于父进程中。请注意峰值是如何略低于8 GiB的,或者您希望生成多少数据(100000个阵列,100x100个条目,每个条目8个字节)

    推荐文章