将传递给函数的对象用作参数,使其重复

WYS*_*WYG 4 python memory-management multiprocessing

我正在使用python对某些数据集进行一些分析,并且此过程会生成庞大的列表/词典,这些列表/词典最多会消耗多达30%top的RAM(如所报道)(24GB)。大约有400个此类数据文件,每个文件都必须进行处理。因此,我一次不能运行两个以上的作业(否则我的系统挂起)。完成每个文件的分析需要几分钟,而整个数据需要将近两天。

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

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

  1. 这会复制列表,即消耗两倍的内存吗?
  2. 将原始变量传递给函数后,是否可以从函数内部删除该变量?使变量global成为可能吗?
  3. 在这种情况下,还有其他方法可以节省内存吗?

例:

# 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
Run Code Online (Sandbox Code Playgroud)

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

在这种情况下,对于每个过程: fun(m[i])

Mar*_*som 5

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

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