存储可重新计算的数据
存储可重新计算的数据 作者:Konrad Hinsen,发表于 2014 年 1 月 3 日 在介绍 ActivePapers 时,我经常被问到的一个问题是“存储计算结果的意义是什么?如果保留代码,则可以重新运行它。您需要存储的只是代码和输入数据。”对此的简短回答是,它在理论上是正确的,但在实践中却不太正确。对于长答案,请继续阅读。您还将了解 ActivePapers 如何帮助您存储和不存储可重新计算数据。首先,让我们弄清楚存储可重新计算数据的明显原因:计算成本可能太高而无法重复运行。这是(重新)计算时间和磁盘存储使用之间权衡的经典案例。在许多情况下,一个好的折衷方案是将结果数据保留一段时间,以便在您有新想法时能够对其进行快速分析,但不要将其存档以供长期存储。接下来,一个不太明显的原因,也是一个我们不太喜欢被提醒的原因:计算可能不具有应有的可重复性。根据运行平台(操作系统、编译器版本等)的不同,产生略有不同结果的程序实际上很常见。使用浮点运算的程序几乎不可避免地属于这一类。当程序两次运行之间的差异如此之大以至于从结果中得出的结论发生变化时,情况会变得尤其糟糕。是的,这种情况确实会发生。最后,存在一种非常常见的情况,其中存储计算的输出数据并不重要,但存储关联的元数据很重要。这就是 ActivePapers 真正的亮点。当您的可重新计算输出实际上是完整工作流程中的中间数据时,就会发生这种情况。例如,您运行一些模拟来产生一些较长的轨迹,然后对轨迹进行一些分析,从中生成一个图。该图表是您的最终结果,所以你想保留它。轨迹和原始分析是中间结果,您不必存储它们,除非它属于上述两个类别之一。但您确实希望存储这样一个事实:您的绘图是根据原始分析生成的,而原始分析又是根据模拟轨迹生成的。有了这些信息,您和以后查看您的工作的任何其他人都可以轻松验证该图实际上是否对应于您的模拟和分析代码的最新版本。 ActivePapers 提供了“虚拟数据集”来处理这种情况。虚拟数据集不包含实际数据,但它具有 ActivePapers 在 codelet 执行期间生成的所有元数据。在 ActivePapers 的当前状态下,生成此类虚拟数据集的唯一方法是首先生成真实数据集,然后运行所有使用它作为输入的 calclet,最后使用 aptool dummy 将真实数据集替换为虚拟数据集…。本教程还提到了虚拟数据集并展示了如何重新计算原始数据。虚拟数据集的用户界面未来还有很大的改进空间。例如,创建数据集的 calclet 可以立即将其标记为虚拟数据集,然后它永远不会写入文件,而是传递到内存中的客户端 calclet。如果您对此有任何想法,请在 GitHub issue tracker上提出问题。由 Disqus 提供支持的评论
Learn Python by coding in your browser
Interactive Python and data-science courses you code directly in the browser