【问题标题】:Data compression using Arrow.jl in Julia在 Julia 中使用 Arrow.jl 进行数据压缩
【发布时间】:2021-10-05 07:00:57
【问题描述】:

我尝试使用Arrow.jl 压缩数据。但是,使用下面的代码进行的测试并没有显示出任何尺寸减小(或压缩)。我可以就我的实施寻求建议,比如我做错了什么? 代码:

using CSV, DataFrames, Arrow
df = CSV.read("input_data.csv", DataFrame)
function compress_data(data::DataFrame)
    io = Arrow.tobuffer(data)
    d = Arrow.Table(io; convert=false)
    Arrow.write("output_data.lz4", d; compress=:lz4)
end
compress_data(df)

期待建议。谢谢!

【问题讨论】:

  • 您的数据可压缩吗?
  • 只有你知道你的数据,所以你必须考虑为什么它可能是可压缩的。值是否限制在一个小范围内?它是一个时间序列,其中后续值接近或与先前值相关?您的测量数据中的数字精度是否远远超过测量精度,因此您可以安全地丢弃仅是噪声的最低有效数字?只有这样,您才能尝试重新排列、转换或截断您的数据,以方便使用 lz4、zlib 等标准工具进行压缩。
  • 感谢@OscarSmith 的回复!为迟到的回应道歉!我猜可能涉及多种数据类型,我猜这可能会导致压缩效率低下。
  • 感谢@MarkAdler 的回复,非常感谢您的洞察力和建议。我一定会尝试按照建议的方法观察数据!

标签: julia compression apache-arrow lz4


【解决方案1】:

代码看起来不错,并且使用全零值的输入 CSV 对其进行测试,压缩率很高。

我怀疑这里的情况是使用浮点数,这里有 2 件可能很棘手的事情需要牢记

  1. 在浮点数在小范围内的情况下,例如0. < x < 1.,我们可能会期待压缩的潜力,但我们可能会感到失望,因为浮点数的字节模式不适合常见的压缩技术。
  2. Float64 的文本表示可能会截断小数,并且每个值存储的字节数少于 8 个字节,因此在保存二进制表示时实际上可以增加保存。

不过,确实存在用于浮点数的压缩技术,例如Blosc,但结果可能会令人失望,除非您对数据很幸运。有损压缩技术可以实现高压缩率,例如zfp 。您可以在 SO 上找到有关该主题的更多信息: Compressing floating point data

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 2015-09-03
    • 2021-04-26
    • 1970-01-01
    相关资源
    最近更新 更多