在使用clojure.data.csv库时,一个问题就是它基于懒序列构建,这会导致处理大量数据时的效率低下。例如,在我机器上,即使没有进行任何转换,对1GB CSV数据的基准解析也花了大约50秒,而其他在JVM上可用的解析器可以在不到4秒内解析这个数量的数据。
我想讨论如何将clojure.data.csv迁移到使用Reducer/Transducer模型,以提高性能和资源管理。概括地说,我认为有几个选择:
- 作为c.d.csv中的次要替代API实现,保留现有的API和实现,以便为遗留用户提供支持。
- 完全替换API,不尝试保留向后兼容性。
- 保留相同的公共API合约,同时在尝试在底层使用Reducers/Transducers重新实现它。在底层使用transducers,但使用
sequence
来保留当前parse-csv的懒序列合约,同时为非遗留用户或不需要基于懒序列实现的用户提供新的纯transducer/reducer基于API。
1和3实际上是同一个想法,但是3中用户可以享受更快底层实现的好处,也可能有其他选择。
我认为如果可行,3将是最佳选择。
选择1和2引发了一个问题,即在向后兼容性或改善遗留用户体验方面不做出尝试。
在深入讨论Reducer/Transducer实现细节之前,我很想了解一下核心团队如何看待进一步探索这一点。
这个