将多处理作业的中间结果转储到文件系统,然后继续处理



我有一个使用multiprocessing包并通过调用函数的作业

CCD_ 2。

输入参数列表中的每个条目都独立于其他条目。

这项工作将持续几个小时。出于安全考虑,我希望以固定的时间间隔(例如,每小时一次)存储介于两者之间的结果。

当作业中止并且我想根据上次可用的备份重新启动它时,我如何才能做到这一点并继续处理?

也许可以使用pickle。点击此处阅读更多:

https://docs.python.org/3/library/pickle.html

根据aws_patrent的评论,我创建了一个完整的多处理示例,以防您不确定如何使用中间结果。第一次运行时,它将打印"无",因为没有中间结果。再次运行以模拟重新启动。

from multiprocessing import Process
import pickle
def proc(name):
data = None
# Load intermediate results if they exist
try:
f = open(name+'.pkl', 'rb')
data = pickle.load(f)
f.close()
except:
pass
# Do something
print(data)
data = "intermediate result for " + name
# Periodically save your intermediate results
f = open(name+'.pkl', 'wb')
pickle.dump(data, f, -1)
f.close()
processes = []
for x in range(5):
p = Process(target=proc, args=("proc"+str(x),))
p.daemon = True
p.start()
processes.append(p)
for process in processes:
process.join()
for process in processes:
process.terminate()

如果有意义的话,您也可以使用json以人类可读的格式输出中间结果。如果需要将数据推送到行中,也可以将sqlite作为数据库。

至少有两种可能的选项。

  1. myFunction的每次调用都将其输出保存到一个唯一命名的文件中。文件名应基于输入数据或链接到输入数据。使用父程序收集结果。在这种情况下,myFunction应该返回已完成项目的标识符
  2. 使用imap_unordered而不是map。这将在结果可用时立即开始生成结果,而不是在所有处理完成时重新生成。让父程序保存返回的数据和指示哪些项目已完成

在这两种情况下,程序都必须检查以前运行中保存的数据,以便在重新启动时调整myListOfInputParameters

哪个选项最好在很大程度上取决于myFunction返回的数据量。如果这是一个很大的数额,那么将其转移回父级会产生很大的开销。在这种情况下,选项1可能是最好的。

由于写入磁盘的速度相对较慢,使用选项2可能会加快计算速度。而且父程序更容易跟踪进度。

请注意,您也可以将imap_unordered与选项1一起使用。

最新更新