15

Makefile 有很多值得喜欢的地方,但也有很多麻烦。

在做各种项目的过程中(我是一名研究科学家、“数据科学家”或其他),我经常发现自己从磁盘上的一些数据对象开始,从中生成各种工件,从这些工件生成工件,并且很快。

如果我可以说“这个对象依赖于这些其他对象”,“这个对象是从这些对象以下列方式创建的”,然后请求一个 Make-like 框架来处理实际构建它们的细节,那就太好了,找出需要更新的对象,将工作分配给多个处理器(如 Make 的-j选项),等等。Makefiles 可以做到这一切——但最大的问题是所有的动作都必须写成 shell 命令。如果我在 R 或 Perl 或其他类似环境中工作,这并不方便。此外,Make 中的一个强有力的假设是所有目标都是文件 - 有一些例外和解决方法,但如果我的目标是数据库中的行,那将是非常痛苦的。

需要明确的是,我不是在追求软件构建系统。我对(更普遍地?)处理依赖项网络的东西感兴趣。

有人知道这些依赖网络的框架吗?似乎它可能是一个很好的数据科学工具,并直观地显示结果是如何产生的,等等。

我最近看到的一个非常有趣的例子是IncPy,但它看起来已经有一段时间没有被触及了,而且它与 Python 非常紧密地结合在一起。它可能也比我希望的要雄心勃勃,这就是为什么它必须与 Python 如此紧密地结合在一起。

抱歉这个模糊的问题,让我知道是否有一些澄清会有所帮助。

4

4 回答 4

5

今天宣布了一个名为“Drake”的新系统,专门针对这种情况: http ://blog.factual.com/introducing-drake-a-kind-of-make-for-data 。看起来很有希望,虽然我还没有真正尝试过。

于 2013-01-25T03:30:31.833 回答
1

这个问题已经有好几年了,但我认为在此处添加重制链接是相关的。

从 GitHub 存储库:

这里的想法是重新想象一组来自 make 但为 R 构建的想法。而不是对 R 的不同实例进行一系列调用(就像在 R 脚本上运行 make 时发生的那样),这个想法是定义R会话中的管道。remake 不是语言不可知论(就像 make must be),而是毫无歉意地以 R 为重点。

它还没有在 CRAN 上,我也没有尝试过,但它看起来很有趣。

于 2018-03-30T22:12:29.203 回答
1

我会尝试一下Bazel 。它主要是一个软件构建系统,但凭借其genrule工件类型,它也可以执行任意文件生成。

Bazel 非常可扩展,使用其类似 Python 的Starlark语言,对于复杂的任务应该比 make 更容易使用。genrule你可以从手工编写简单的步骤开始,然后将常用模式重构为,如果事情变得更复杂,甚至可以编写自己的规则。因此,您应该能够在高层次上表达您的个人转换,以模拟您对它们的看法,然后使用感觉像是一种适当的编程语言的东西将该表示转换为较低级别的构造。

make 取决于时间戳,而 Bazel 则检查指纹。因此,如果在任何一个步骤产生相同的输出,即使其输入之一发生了变化,那么后续步骤将不需要再次重新计算。如果您的某些数据处理步骤投影或过滤数据,则这种事情发生的可能性很高。

我看到你的问题被标记为 R,尽管它没有太多提及。在引擎盖下,在 Bazel 中,R 计算仍然归结为R CMDshell 上的调用。但是您可以以复杂的方式组装复杂的多行命令,以读取您的输入、处理它们并存储输出。R如果二进制文件的初始化成本是一个问题, Rserve可能会有所帮助,尽管使用它会使设置依赖于Rserve我相信的本地可访问实例。即使这样,我也看不到任何可以避免将数据存储到文件并从文件中加载回来的成本。如果您希望通过在步骤之间将内容保存在内存中来避免该成本,那么您将寻找一个非常特定于 R 的工具,而不是您要求的通用工具。

在“直观地显示结果是如何生成的”方面,bazel query --output graph可用于生成依赖图的graphviz dot文件。

免责声明:我目前在 Google 工作,该公司内部使用 Bazel 的一种变体,称为 Blaze。实际上 Bazel 是 Blaze 的开源发布版本。我非常熟悉使用 Blaze,但不熟悉从头开始设置 Bazel。

于 2021-12-15T15:31:05.590 回答
0

Red-R有一个数据流编程的概念。我还没有尝试过。

于 2012-12-15T02:19:16.043 回答