【问题标题】:float Array compression in javascriptjavascript中的浮点数组压缩
【发布时间】:2013-09-19 08:30:09
【问题描述】:

我看到了很多 js 的压缩方法,但在大多数情况下,压缩数据是字符串形式的,并且包含文本。我需要在 0-1 范围内压缩小于 10^7 个浮点数的数组。

由于精度并不是很重要,最终我可以将其保存为仅包含数字 0-9 的字符串(每个浮点数仅包含 2 个小数点后的第一个数字)。什么方法最适合这样的数据?我希望输出尽可能小,但压缩这个字符串不应该超过 10 秒,每个浮点数保存 2 位数字时大约有 10 000 000 个符号。我看到了很多 js 的压缩方法,但在大多数情况下压缩数据是字符串,它包含文本。我需要在 0-1 范围内压缩小于 10^7 个浮点数的数组。

由于精度并不是很重要,最终我可以将其保存为仅包含数字 0-9 的字符串(每个浮点数仅包含 2 个小数点后的第一个数字)。什么方法最适合这样的数据?我希望输出尽可能小,但解压缩此字符串的时间不应超过 10 秒,每个浮点数保存 2 位数字时大约有 10 000 000 个符号。

数据包含声音波形记录,用于在不支持 Web Audio API 的旧浏览器上进行可视化。波形在 Chrome 用户客户端上以 20 fps 的速度记录,压缩并存储在服务器数据库中。然后在请求绘制可视化后发送回 IE 或 ff - 所以我需要有损压缩 - 实现能够与歌曲元数据请求一起发送的大小确实是有损的。我希望 wav -> mp3 64k 级别的压缩是可能的(比如 200:1 或其他东西)没有人会认识到波形在可视化上并不完美,我想也许将这些浮点数保存为 0-9a-Z 它给出 36 而不是100 步,但将一个频率的记录减少到 1 个符号。但是接下来,在这个带有 0-Z 符号的字符串上使用什么压缩来实现最佳压缩? lzma 适合这样的字符串吗?压缩/解压将在 Web Worker 上运行,因此它不需要真正即时 - 解压缩像 10 秒,压缩无关紧要 - 而不是一首歌,所以大约 2 分钟

【问题讨论】:

  • 这个问题的答案在很大程度上取决于您的数据,就像所有压缩算法一样。您的所有值都是 0.01 - 1.00,比如百分比吗?或者是否有 0.0000042 隐藏在数据中。你对你的花车了解多少?如果它们都恰好是 0.05,那么压缩算法是微不足道的。从根本上说,如果你说你只需要 2 个十进制数字,那么这意味着每个浮点数需要大约 1 个字节左右的数据。如果您的浮点数都是 32 位的,那么这意味着您的最佳压缩率为 4:1。这够好吗?

标签: javascript arrays string performance compression


【解决方案1】:

在黑暗中拍摄,如果你真的只能依赖小数点后的前两位数(即数组中没有 0.00045s),并且你需要两位数,最简单的方法就是乘法乘以 256 并将整数部分作为一个字节

encoded = Math.floor(floatValue * 256)
decoded = encoded / 256.0

但是,如果您对数据了解得更多,就可以从值中挤出更多的熵。这得出 4:1 的压缩比。

【讨论】:

    猜你喜欢
    • 2012-01-27
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多