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

时间:2019-01-01 13:55:47

标签: python python-multiprocessing

我有一份使用multiprocessing软件包并通过

调用函数的工作。

resultList = pool.map(myFunction, myListOfInputParameters)

输入参数列表的每个条目都是彼此独立的。

此作业将运行几个小时。出于安全原因,我想存储在固定时间间隔内(例如每小时一次。

当作业被中止并且要根据上一次可用的备份重新启动时,我该如何做才能继续进行处理?

2 个答案:

答案 0 :(得分:3)

也许用泡菜。在此处阅读更多信息:

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

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

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 :(得分:1)

至少有两个选择。

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

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

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

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

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