我有一个算法需要7天才能运行完成(还有更多算法)
问题:为了成功运行程序,我需要持续供电。如果运气不好,中间会出现断电,我需要重新启动它。
所以我想问一个方法,我可以让我的程序分阶段执行(比如每个阶段产生结果A,B,C,......),现在在断电的情况下我可以用一些如何使用这个中间结果并从那一点继续/恢复运行。
问题2:每次循环迭代时,我将如何防止文件重新打开(fopen被放置在运行近百万次的循环中,这是因为每次迭代都要更改文件时需要)
答案 0 :(得分:2)
您可以在某些源文件中将其分开,然后使用make。
答案 1 :(得分:2)
每个结果阶段完成后,分支到新的Universe。如果新宇宙中的力量失效,则将其摧毁并及时返回到您分支的点。重复所有阶段,然后通过超越虫洞将结果合并到原始宇宙中。
答案 2 :(得分:2)
嗯,有几种选择,我想:
请注意,这两个选项都可能会进一步缩短您的7小时运行时间!
因此,为了改善整体运行时,您是否还可以将算法分开,以便它具有可以并行处理“作业”的“工作”组件。这通常意味着抽出一些可以参数化的“哑”但密集的逻辑(例如计算)。然后,您可以选择在网格/空间/云/任何地方运行算法。至少你可以选择减少运行时间。甚至不需要是一个空间...只需使用队列(IBM MQ系列有一个C接口),只需在其他框上有监听器监听您的作业队列并处理结果,然后再保留结果。您仍然可以按照上面的讨论对算法进行分阶段。
答案 3 :(得分:0)
问题2:在循环的每次迭代中打开文件,因为它已被更改
我可能不是最有资格回答这个问题但是在每次迭代(和fopen
)上做fclose
大概是浪费和缓慢的。要回答,或者有更多合格的答案,我想我们需要更多地了解您的数据。
例如:
我问,根据你的评论判断“因为它改变了每次迭代”,你会更好地使用随机访问文件。通过这个,我猜你正在重新开放fseek
到你可能已经通过的点(在你的数据流中)并做出改变。但是,如果您将文件打开为二进制文件,则可以使用fseek
和fsetpos
fseek
遍历文件中的任何位置。也就是说,你可以向后“寻找”。
此外,如果您的数据是基于记录的或以某种方式组织的,您还可以为其创建索引。有了这个,你可以使用fsetpos
将指针设置在你感兴趣的索引上并遍历。因此,节省了查找要更改的数据区域的时间。您甚至可以将索引保存在附带的索引文件中。
请注意,您可以将纯文本写入二进制文件。也许值得研究一下?
答案 4 :(得分:0)
对我来说听起来像是经典的批处理问题 您需要在应用程序中定义检查点并存储中间数据,直到达到检查点为止 检查点可以是数据库中的行号,也可以是文件中的位置 您的处理可能需要比现在更长的时间,但它会更可靠 一般来说,你应该考虑你的算法中的瓶颈 对于问题2,您必须使用两个文件,如果您拨打fopen少一百万次,那么您的应用程序可能会快几天......