现在,可能是第50,000位的数据非常大,这导致了OOM,因此要对此进行测试,我将首先尝试:
file_list_chunks = list(divide_chunks(file_list_1,20000))[30000:]
如果它在10,000处失败,这将确认20k的块大小是否太大,或者如果再次在50,000处失败,则代码存在问题…
好的,进入代码…
首先,您不需要显式list
构造函数,在python中进行迭代比将整个列表生成到内存中要好得多。
file_list_chunks = list(divide_chunks(file_list_1,20000))
# becomes
file_list_chunks = divide_chunks(file_list_1,20000)
我认为您可能在这里滥用ThreadPool:
阻止将更多任务提交给池。所有任务完成后,工作进程将退出。
这听起来像close
有些想法仍在运行,尽管我认为这是安全的,但感觉有点不符合Python风格,最好将上下文管理器用于ThreadPool:
with ThreadPool(64) as pool:
results = pool.map(get_image_features,f)
# etc.
您应该 在 加入之后/之后使用:
with ThreadPool(..):
...
pool.join()
gc.collect()
您也可以尝试将其切成小块,例如10,000甚至更小!