使用clojure.data.csv库的一个问题是,它建立在懒序列之上,这可能导致处理大量数据时的低效,例如,在我机器上,即使在没有任何转换的情况下,解析1gb的CSV数据的基础线大约需要50秒。其他在JVM上可用的解析器可以在不到4秒内解析这么多的数据。
我想讨论如何将clojure.data.csv迁移到使用Reducer/Transducer模型,以提高性能和资源管理。一般而言,我认为有几个选择
- 将其作为c.d.csv中的一个次要替代API实现,同时保留现有的API和实现,为遗留用户提供。
- 完全不保留向后兼容性,完全替换API。
- 保持相同的公共API合约,同时在下面尝试用reducer/transducer的概念重新实现。使用transducer但使用
sequence
来保留当前的解析csv懒策略,同时为非遗留用户或不需要基于懒策略的实现的用户提供新的纯transducer/reducer API。
1和3基本上是相同的概念,只是3在3中用户获得了更快的底层实现的好处,也可能有其他选项。
我认为如果可能的话,3是最好的选择。
选项1和2引发了一个问题,即不试图保留向后兼容性或改善遗留用户的使用体验。
在深入探讨reducer/transducer实现的细节之前,我很想知悉核心团队对进一步探索此议题的看法。
这个议题