当前位置: 首页 > 知识库问答 >
问题:

使用Python多处理的高内存使用率

锺离晗昱
2023-03-14
import multiprocessing as mp
import time

def calculate(num):
    l = [num*num for num in range(num)]
    s = sum(l)
    del l       # delete lists as an  option
    return s

if __name__ == "__main__":
    pool = mp.Pool(processes=2)
    time.sleep(5)
    print "launching calculation"
    num_tasks = 1000
    tasks =  [pool.apply_async(calculate,(i,)) for i in range(num_tasks)]
    for f in tasks:    
        print f.get(5)
    print "calculation finished"
    time.sleep(10)
    print "closing  pool"
    pool.close()
    print "closed pool"
    print "joining pool"
    pool.join()
    print "joined pool"
    time.sleep(5)
+---------------+----------------------+----------------------+
|  num_tasks    |  memory with del     | memory without del   |
|               | proc_1   | proc_2    | proc_1   | proc_2    |
+---------------+----------------------+----------------------+
| 1000          | 4884     | 4694      | 4892     | 4952      |
| 5000          | 5588     | 5596      | 6140     | 6268      |
| 10000         | 6528     | 6580      | 6640     | 6644      |
+---------------+----------------------+----------------------+
    null

共有1个答案

金令秋
2023-03-14

我做了很多研究,但找不到解决问题的办法。但是有一个不错的工作,可以防止内存井喷,成本很小,尤其是在服务器端长时间运行的代码上。

解决方案基本上是在完成固定数量的任务后重新启动各个辅助进程。python中的pool类将MaxTaskSperChild作为参数。您可以指定maxtasksperchild=1000,从而限制每个子进程运行1000个任务。到达MaxTaskSperChild号后,池将刷新其子进程。对于最大任务使用一个谨慎的数字,可以平衡所消耗的最大内存和与重新启动后端进程相关的启动成本。构造如下:

pool = mp.Pool(processes=2,maxtasksperchild=1000)

我把我的全部解决方案放在这里,这样它就可以对其他人有用!

import multiprocessing as mp
import time

def calculate(num):
    l = [num*num for num in range(num)]
    s = sum(l)
    del l       # delete lists as an  option
    return s

if __name__ == "__main__":

    # fix is in the following line #
    pool = mp.Pool(processes=2,maxtasksperchild=1000)

    time.sleep(5)
    print "launching calculation"
    num_tasks = 1000
    tasks =  [pool.apply_async(calculate,(i,)) for i in range(num_tasks)]
    for f in tasks:    
        print f.get(5)
    print "calculation finished"
    time.sleep(10)
    print "closing  pool"
    pool.close()
    print "closed pool"
    print "joining pool"
    pool.join()
    print "joined pool"
    time.sleep(5)
 类似资料:
  • 问题内容: 我写了一个程序,可以总结如下: 实际代码(尤其是)要复杂得多。仅使用将其当作参数的这些值(意味着它不引用) 基本上,它将巨大的数据集加载到内存中并进行处理。输出的写操作委托给一个子进程(它实际上写到多个文件中,这需要很多时间)。因此,每次处理一个数据项时,它都会通过res_queue发送到子流程,然后该子流程根据需要将结果写入文件中。 子流程不需要访问,读取或修改以任何方式加载的数据。

  • 我已经读了一些关于我的问题的帖子(比如这篇文章),但没有一篇能解决这个问题。在我的Flask应用程序中,我使用内置在多处理中的Python(在16个物理核心上)并行下载了32-64个图像,如下所示: 下载工作正常,除了内存使用外,速度显著提高。在下载过程中,Python分配了大约100GB的RAM,尽管实际只使用了大约2GB。每个进程分配超过6 gb的RAM,仅用于下载最多4个图像,每个图像的容量

  • 程序每天使用的内存在增加。有人能搞清楚是怎么回事吗? 当作业超出运行方法的范围时,内存应该是空闲的,对吗?

  • 问题内容: 我想在共享内存中使用一个numpy数组,以便与多处理模块一起使用。困难是像numpy数组一样使用它,而不仅仅是ctypes数组。 这将产生如下输出: 可以ctypes方式访问该数组,例如arr[i]说得通。但是,它不是一个numpy数组,因此我无法执行,或。我想一个解决方案是将数组转换为数组。但是(除了无法完成这项工作外),我不相信会再共享它。 对于必须解决的常见问题,似乎将有一个标准

  • 我试图了解python类是如何实现的,以及分配给它们会消耗多少内存。所以我创建了一个大的numpy数组,然后将其分配给一个类,然后将该类分配给另一个类(如下所示)。 使用sys。getsizeof似乎无助于获取numpy阵列的内存大小。Numpy数组使用nbytes,但是引用Numpy数组的类没有nbytes作为方法。 如果我更改了,则和会自动更新以反映它。Python文档说明对象别名类似于指针。

  • 问题内容: 我在Linux下运行的Java应用程序有问题。 当启动应用程序时,使用默认的最大堆大小(64 MB),我看到使用tops应用程序为该应用程序分配了240 MB的虚拟内存。这会给计算机上的某些其他软件带来一些问题,这是相对有限的资源。 据我了解,保留的虚拟内存无论如何都不会使用,因为一旦达到堆限制,OutOfMemoryError就会抛出。我在Windows下运行了相同的应用程序,并且看