【发布时间】:2021-09-29 05:44:27
【问题描述】:
在我的代码方面需要一些帮助,我正在尝试使用 pool 在我的列表中运行一些函数。
它是一个包含大量数据的文件。比如 71GB 的文本。
我正在尝试尽可能快地越线。 但是由于某种原因在运行过程中,我被内存耗尽了
我认为这是因为我的 pool.close 和 pool.join 在我的代码末尾。
但我不确定如何修复它以避免内存泄漏。我认为我的进程永远不会死并保存数据。
注意:api.delete_object(item) 返回大量数据。也许它会以某种方式卡在内存中?
这是我的代码:
import pandas as pd
import boto3
from multiprocessing.pool import ThreadPool as Pool
pool_size = 8 # my "parallelness"
def worker(item):
try:
result = api.delete_object(item)
except:
print('error with item')
pool = Pool(pool_size)
i=0
for chunk in pd.read_csv("/folder/files_to_delete",chunksize=1000,header=None):
i+=1000
for ind in chunk.index:
if "something.txt" not in chunk[0][ind]:
pool.apply_async(worker, (chunk[0][ind],))
print("{}".format(i), end='\r')
pool.close()
pool.join()
【问题讨论】:
-
两件事:即使在使用 fork 时,使用
if __name__ == "__main__":来保护执行也是一个好习惯。您可以在池构造函数中设置maxtasksperchild关键字,以定期重新启动工作进程,以收集管理不善的资源。 -
我应该设置多少? maxtasksperchild = 1?对内存泄漏有帮助吗?
-
maxtasksperchild 不能在 TheardPool 上使用,我应该使用不同的处理方法吗? @亚伦
-
我错过了
ThreadPool我的错误。也许可以尝试tracemalloc或其他一些第三方库来分析内存使用情况以找到泄漏?
标签: python pandas multithreading multiprocessing threadpool