首页 > 解决方案 > 有效地将浮点数导出到 CSV 文件

问题描述

出于预计算的目的,我需要将大量(数千万)单精度浮点数存储在一个逗号分隔的文件中。

我的性能优先级按以下顺序排列:

  1. 阅读速度
  2. 文件大小
  3. 写入速度

现在我只是在写数字的字符串表示,这显然可以改进。有什么好的方法可以做到这一点?

标签: c#csvoptimizationcompression

解决方案


对于您的 #2 目标,您需要知道数字的哪些部分实际上很重要,以及是否存在相关性。它们的范围是否受到限制?测量它们的准确度是多少?所有六位数都重要吗?这是一个连续数字之间差异很小的时间序列吗?

该信息可用于压缩浮点值序列。限制它们值所代表的范围和精度。如果存在相关性,您可以获取连续值之间的差异并仅发送那些(第一个除外)。或者你可以有一个更复杂的模型来预测下一个给定序列的下一个数字,并发送每个数字的实际值和预测值之间的差异。

然后你可以尝试使用标准的无损压缩器压缩结果,例如 gzip、zlib、zstd、lz4 等。

这一切都会产生一个紧凑的二进制文件。如果您确实需要结果是可读的 .csv,您仍然可以限制精度并进行差异编码,以提供一些压缩。然后需要在另一端撤消差异编码。


推荐阅读