python循环中释放内存的方法_python - 在python并行进程循环中释放内存 - 堆栈内存溢出...

邵飞宇
2023-12-01

我正在使用主从结构来实现并行计算。 单个主进程( 0 )加载数据,并将相关的块和指令分配给使用大型对象进行繁重工作的从属进程( 1 N )……等等等等。 问题是内存使用情况,我正在每个从属进程上使用resource.getrusage(resource.RUSAGE_SELF).ru_maxrss进行监视。

正如预期的那样,第一个任务使用了大约6GB的内存,但是当从属设备接收到第二个任务时,它最多会膨胀到10GB以上-好像没有在收集以前的内存。 我的理解是,只要变量释放其引用(在下面的代码中,当_gwb变量被重置时),垃圾收集_gwb清理干净。 为什么不发生这种情况?

在每个循环结束时添加del _gwb会有所帮助吗?

手动调用gc.collect()怎么样?

还是我需要按照此答案中的描述生成subprocess es?

我在SLURM托管群集上使用mpi4py 。

主过程看起来像:

for jj, tt in enumerate(times):

for ii, sim in enumerate(sims):

search = True

# Find a slave to give this task to

while search:

# Repackage HDF5 data into dictionary to work with MPI

sim_dat = ... # load some data

# Look for available slave process

data = comm.recv(source=MPI.ANY_SOURCE, tag=MPI.ANY_TAG)

src = stat.Get_source()

# Store Results

if tag == TAGS.DONE:

_store_slave_results(data, ...)

num_done += 1

elif tag == TAGS.READY:

# Distribute tasks

comm.send(sim_data, dest=src, tag=TAGS.START)

# Stop searching, move to next task

search = False

cycles += 1

和奴隶 :

while True:

# Tell Master this process is ready

comm.send(None, dest=0, tag=TAGS.READY)

# Receive ``task`` ([number, gravPot, ndensStars])

task = comm.recv(source=0, tag=MPI.ANY_TAG, status=stat)

tag = stat.Get_tag()

if tag == TAGS.START:

_gwb = Large_Data_Structure(task)

data = _gwb.do_heavy_lifting(task)

comm.send(data, dest=0, tag=TAGS.DONE)

elif tag == TAGS.EXIT:

break

cycles += 1

编辑:其他一些奇怪的微妙之处(如果它们可能是相关的):

1)只有一些进程显示内存在增长,其他进程大致保持不变;

2)在不同的从属进程上,活动的特定内存量有所不同(相差100s of MB ...即使它们必须运行相同的代码!

 类似资料: