在使用clojure.data.csv库时,一个问题是在处理大量数据时,它基于惰性序列,这会导致效率低下,例如,在我机器上的CSV的基线解析只要50秒就能完成1gb数据,而其他JVM上可用的解析器可以在不到4秒内解析这么大量的数据。
我想讨论如何将clojure.data.csv移植到使用Reducer/Transducer模型,以改进性能和资源处理。概括来说,我认为有几个选项
- 将其作为c.d.csv的二级替代API实现,保留现有API和实现,以方便遗留用户。
- 完全替换API,不尝试保留向后兼容性。
- 保留相同的公开API接口,同时尝试在底部使用Reducer/Transducer重新实现。使用transducer,但使用
sequence
保留当前parse-csv惰性序列的合同,同时为新用户或不需要基于惰性序列实现的用户提供新的纯transducer/reducer API。
选项1和3基本上是相同的概念,只是选项3的用户能够受益于更快的底层实现,也可能有其他选项。
我认为如果可能的话,选项3是最好的选择。
选项1和2引起了一个问题,即不尝试向后兼容或改善遗留用户的体验。
在深入了解Reducer/Transducer实现细节之前,我想了解一下核心团队对这个进一步探索的看法
。