将传递的对象作为参数运行,得到重复

时间:2014-01-03 05:26:12

标签: python memory-management multiprocessing

我正在使用python对某些数据集进行一些分析,这个过程会产生巨大的列表/字典,最多可以消耗高达30%(由top报告的)RAM(24GB)。有大约400个这样的数据文件,每个都需要处理。因此,我不能一次运行两个以上的工作(否则我的系统挂起)。完成每个文件的分析需要几分钟,整个数据需要接近两天。

唯一的解决方案是使用并行处理并实现它我需要创建将执行任务的函数。

第一步保持不变 - 打开文件,读取,拆分并存储为列表。 通常我会在列表上进行分析 - 获取另一个列表,然后删除前一个列表以节省内存。但是,如果我使用多处理,我必须将此列表作为参数传递给某个函数。

  1. 这会重复列表,即消耗两倍的内存吗?
  2. 是否可以在函数内传递给函数后删除原始变量?是变量global可能的方式吗?
  3. 在这种情况下还有其他方法可以节省内存吗?
  4. 示例:

    # OPEN FILE #
    f=open(args.infile,'r')
    a=f.read()
    f.close()
    mall=findall('[^%]+',a)
    del a
    lm=len(mall)
    m=[]
    for i in range(args.numcores):
        if i<args.numcores-1:
            m[i]=mall[i*args.numcores:(i+1)*args.numcores]
        else:
            m[i]=mall[i*args.numcores:lm]
    del mall
    

    然后将其传递给函数fun(<list>)

    在每种流程的情况下:fun(m[i])

1 个答案:

答案 0 :(得分:4)

不,没有该对象的副本。传递给函数的参数引用与调用者相同的对象。

删除函数中的变量无济于事,因为在调用站点上仍有引用。在所有引用都消失之前,不会发生垃圾收集。