tl;博士如何将 IReduceInit 转换为转换值的惰性序列
我有一个数据库查询,它产生了一个相当大的数据集,用于在客户端上进行实时旋转(百万或两行,25 个属性 - 对于现代笔记本电脑来说没问题)。
我的(简化的)堆栈是调用 clojure.jdbc 来获取(我认为是惰性的)结果行序列。我可以通过 ring-json 中间件将其作为主体传递出去,从而将其序列化。ring-json 在堆上构建响应字符串存在问题,但是从 0.5.0 开始可以选择将响应流式传输出去。
我通过分析几个失败案例发现,实际上 clojure.jdbc 在将其返回之前将整个结果集实现在内存中。没问题!reducible-query
我决定转向新的 next.jdbc,而不是在那个库中工作。
next.jdbc 中的关键操作是plan
返回一个 IReduceInit,我可以使用它来运行查询并获取结果集...
(into [] (map :cc_id) (jdbc/plan ds ["select cc_id from organisation where cc_id = '675192'"]))
["675192"]
然而,这实现了整个结果集,并且在上述情况下会给我所有的 id 预先和内存。对一个人来说不是问题,但我通常有很多。
如果我给出一个起始值,我可以减少 IReduceInit 计划,所以我可以在减少函数中进行输出......(谢谢@amalloy)
(reduce #(println (:cc_id %2)) [] (jdbc/plan ds ["select cc_id from organisation where cc_id = '675192'"]))
675192
nil
...但理想情况下,我想在对它们应用转换函数后将此 IReduceInit 转换为值的惰性序列,因此我可以将它们与 ring-json 和 cheshire 一起使用。我没有看到任何明显的方法。