使用 clojure.data.csv 库时遇到的一个问题是,它是基于懒序列构建的,这可能导致处理大量数据时的低效,例如在我机器上,即使没有进行任何转换,解析 1gb 的 CSV 数据也需要大约 50 秒。其他在 JVM 上可用的解析器可以在不到 4 秒内解析这么多的数据。
我想讨论如何将 clojure.data.csv 转移到使用缩减器/变换器模型,以改进性能和资源管理。大体而言,我认为有几个选择
- 将此作为 c.d.csv 的次要替代 API 实现,同时保留现有的 API 和实现,以便为遗留用户留出空间。
- 完全替换 API,不尝试保留向后兼容性。
- 保留相同的公共 API 合同,同时尝试在缩减器/变换器的术语下重新实现。在底层使用变换器,但使用
sequence
保留当前的 parse-csv 懒序列合同,同时为非遗留用户或不需要基于懒序列的实现的用户提供访问新纯变换器/缩减器 API 的途径。
1 和 3 实际上是相同的思想,不过 3 提供了更快的底层实现的好处,可能还有其他选择。
我认为 3 是最佳选择。
选项 1 和 2 引发了是否尝试保持向后兼容性或改善遗留用户体验的问题。
在深入了解缩减器/变换器实现细节之前,我想了解一下核心团队对进一步探索这一领域的看法
这个。