留言者:bendlas
sax-js 似乎不支持流式处理 ..
我不太理解:SAX 直译为“XML流式API”,查看其 README 示例,我原本预计它允许多次调用 .write 完成部分块,然后再调用最终的 .close
有好的选项可以在其基础上构建流式 Node 解析器吗?
我找到的所有各种流式处理解析器都是建立在 sax-js 之上的,所以我将选择它。
使用 lazy seqs 的流式支持会非常好!
关键在于:像 lazy seqs 这样的特性并不适用于 JS 的 IO,因为 JS 中一切都是非阻塞的。所以在 Java 中,你可以在 lazy seq 的 .next 等待输入时阻塞线程,而在 JS 中不能这样做。推测 Node.js 中可能存在阻塞 IO 选项,但对于以单线程性质为主的 Node 程序来说仍然是糟糕的。这也是为什么没有 XMLPull API (StAX) 为 JS 而存在的原因。
data.xml 基于 StAX 构建的原因是因为它与 lazy seqs 很自然地相匹配,并且那时这是在 clojure 中进行流式处理的首选方式。另一方面,SAX 是一个推模型,非常适合 JS,因为你的程序是由输入 IO 驱动的。
最近,clojure 已经通过 transducer 形式获得了对推流式处理的坚实支持。我在考虑在 data.xml 上基于 transducer 的可能性,这样可以为 StAX 和 SAX 源提供统一的支持。作为奖励,这有可能使 data.xml 运行得更快,因为它可以减少中间分配。