Jane Street 开源增量计算库 Incremental
Jane Street: Incremental
Jane Street 开源了一个名为 Incremental 的 OCaml 库,灵感源自 Umut Acar 等人的自调整计算研究。这个库能帮你构建复杂的计算流程,当输入数据变化时,它不会重新跑遍所有步骤,而是聪明地只更新受影响的部分。无论是处理类似电子表格的大型计算、构建响应迅速的 GUI 视图,还是确保派生数据与源数据实时同步,Incremental 都能提供高效的解决方案。项目已在 GitHub 上获得 1k 星标,是追求极致性能开发者的新利器。
Incremental 是一个库,它提供了一种构建复杂计算的方法,当输入发生变化时,这些计算能够高效地更新。
HN 评论区
69- jitl
这种反应式编程风格如今在 JavaScript UI 框架中非常流行,被称为“signals”,这里有一个标准化提案:https://github.com/tc39/proposal-signals#-javascript-signals...
Vue、SolidJS、Svelte、Ember、Angular 等框架都在使用,React 也有几种不同的实现,比如 Mobx 和 Jotai。关于如何传播变化以及评估 DAG,存在几种不同的算法,我相信 SolidJS2 使用的是一种基于高度的算法,与 Incremental 类似。
我一直在尝试一种实现,它使用 Int32Array arena 来分配节点,并用链表将它们连接起来,而无需承担 O(依赖边) 的 GC 开销:https://github.com/justjake/dalien-signals/tree/dalien-signa...
Rust 中也有几个类似的库,UI 框架中的 Leptos 就是一个例子,而通用增量计算中的 Salsa 则是另一个例子,rust-analyzer 就在用它。
看待这类问题的另一种方式是将其视为一个自动追踪依赖关系的构建系统。tup 就是这样一个构建系统,它会通过插桩构建任务来检测它们读取了哪些文件,从而建立依赖关系。作者的文章值得一读:https://gittup.org/tup/build_system_rules_and_algorithms.pdf,另见经典文章 Build Systems à la Carte:https://www.microsoft.com/en-us/research/wp-content/uploads/...
- fadesibert
Goldman 大约 30 年前在衍生品定价上也采用了同样的方法。我记得在我在那里的 13 年任期内,我们曾就“Node Purpling”进行过长时间的讨论。
计算机科学已经发展了,据我所知,这并不是一个图论方法,但像微分这样的操作计算成本很高,因此你希望将其执行次数最小化,尽可能接近理论最小值。
编辑:相关的 HN 讨论 https://news.ycombinator.com/item?id=36006737
- ronfriedhaber
这很酷。
据我了解,Incremental 这个库旨在解决当源数据改变时,部分重新计算计算图的问题。这种方法与(设计良好的)构建系统所采用的方法类似,在 FP 界也很常见。[2] 它有很多应用场景,非常酷。
此外,在增量计算领域,还有 Differential Dataflow、Timely Dataflow(相邻领域)和 DBSP。像 Feldera 这样的系统就是建立在 DBSP 之上的。Materialize 由一些 DD 的人领导。
就我个人而言,我正在针对金融数据和金融工作负载的问题,探索一种正交的方法。这里存在巨大且非常重要的问题需要解决![1]
[2] Signals And Threads 关于该主题的剧集 https://signalsandthreads.com/build-systems/
- djtango
很多年前我对 Dataflow 编程非常好奇——我想很多人都是从各个角度来研究这个问题的。这个特定的库立刻让我想起了 Clojure 中的 Javelin [0]
- RandomBK
有一件事我从未完全搞懂:这与可观察(observable)模式有何不同?在可观察模式中,可以向输入发布新值,将变化传播到计算中,并将新计算的值推送给监听器。
我想可能有一些关于变化检测和如果没有变化就停止传播的优化(尽管可观察模式也能做到这一点)。stabilize 命令也很有趣,它提供了一种在重新计算之前将变化批处理在一起的方法(但同样,可观察模式也能做到)。
主要的差异是来自内省和自动构建计算图吗?还是有什么更根本的东西是我遗漏了?