5

我们开发了一种数据处理工具,可以从一组给定的原始数据中提取一些科学结果。在数据科学中,您可以重新获得结果并重复计算,这会产生结果集,这一点非常重要

由于该工具正在发展,我们需要一种方法来找出我们工具的哪个修订/构建生成了给定的结果集,以及如何找到构建该工具的相应源。

该工具是用 C++ 和 Python 编写的;使用 Boost::Python 将 C++ 部分粘合在一起。我们使用 CMake 作为构建系统,为 Linux 生成 Make 文件。目前该项目存储在 subversion repo 中,但我们中的一些人已经使用 git resp。hg,我们计划在不久的将来将整个项目迁移到其中之一。

在这种情况下,获得源代码、二进制文件和结果集之间唯一映射的最佳实践是什么?

我们已经在讨论的想法:

  • 以某种方式注入全局修订号
  • 使用内部版本号生成器
  • 将整个源代码存储在可执行文件本身中
4

2 回答 2

3

这是我花费大量时间研究的问题。对于@VonC 已经写的内容,让我添加一些想法。

我认为软件配置管理的主题很好理解,并且经常在商业环境中仔细实践。然而,这种通用方法通常在科学数据处理环境中缺乏,其中许多环境要么留在学术界,要么已经从学术界发展出来。但是,如果您处于这样的工作环境中,则有现成的信息和建议来源以及许多可以提供帮助的工具。我不会进一步展开这个。

我不认为您建议将整个源代码包含在可执行文件中,即使可行,也是必要的。确实,如果您获得了正确的 SCM,那么您已经完成并继续这样做的一项基本测试就是您按需重建“旧”可执行文件的能力。您还应该能够确定每个可执行文件和版本中使用了哪个版本的源代码。这些应该使在可执行文件中包含源代码变得不必要。

正如您所说,将结果集与计算相关联的主题也是必不可少的。以下是我们正在构建的解决方案的一些组件:

我们正在从作为许多科学程序输出特征的传统非结构化文本文件转向结构化文件,在我们的案例中,我们正在研究 HDF5 和 XML,其中感兴趣的数据和元数据被储存了。元数据包括用于产生结果的程序(和版本)的标识、输入数据集的标识、作业参数和一堆其他东西。

我们研究了使用 DBMS 来存储我们的结果;我们想走这条路,但今年我们没有资源去做,可能明年也没有。但是企业使用 DBMS 有多种原因,其中一个原因是它们能够回滚、提供审计跟踪等。

我们也在密切关注需要存储哪些结果集。一个好的方法是只存储从我们的现场传感器捕获的原始数据集。不幸的是,我们的一些计算需要 1000 多个 CPU 小时才能产生,因此无法按需从头开始重现它们。但是,我们未来存储的中间数据集将比过去少得多。

我们也让用户直接编辑结果集变得更加困难(我想这是不可能的,但不确定我们是否还存在)。一旦有人这样做,世界上所有的出处信息都是错误的和无用的。

最后,如果您想阅读有关该主题的更多信息,请尝试在 Google 上搜索“科学工作流程”和“数据来源”类似的主题。

编辑:从我上面写的内容不清楚,但我们已经修改了我们的程序,以便它们包含自己的标识(我们使用 Subversion 的关键字功能和我们自己的一两个扩展名)并将其写入他们产生的任何输出.

于 2010-07-15T13:08:37.297 回答
1

您需要考虑hg subreposgit 子模块

这种情况下的最佳实践是拥有一个父仓库,它将引用:

  • 工具的来源
  • 从该工具生成的结果集
  • 理想情况下是 c++ 编译器(不会每天都在发展)
  • 理想情况下是 python 发行版(不会每天都在发展)

其中每一个都是一个组件,即一个独立的存储库(Git 或 Mercurial)。
每个组件的一个精确修订版将由父存储库引用。

所有过程都代表了基于组件的方法,并且是充分利用 SCM(此处为软件配置管理)的关键。

于 2010-07-14T10:25:31.267 回答