【发布时间】:2014-05-28 12:47:00
【问题描述】:
我有一个大数组(约 400.000.000 个条目),整数为 {0, 1, ..., 8}。 所以我每个条目需要 4 位。大约 200 MB。
目前我使用字节数组并在每个条目中保存 2 个数字。
我想知道,如果有一个好的方法来压缩这个数组。我做了一个快速的研究,发现了像 Huffmann 或 LZW 这样的算法。但是这些算法都是为了压缩数据,将压缩后的数据发送给某人并解压缩。
我只想拥有一个内存空间较小的表,以便将其加载到 RAM 中。 200MB 的桌子很容易安装,但我正在考虑更大的桌子。
重要的是,我仍然能够确定某些位置的值。
有什么建议吗?
更多信息: 我只是做了一点实验,结果表明,平均 2.14 个连续数字具有相同的值。 有 1 个零、154 个一、10373 个二、385990 个三、8146188 个四、85008968 个五、265638366 个六、70791576 个七和 80 个八。 所以超过一半的数字是6。
我只需要一个快速的 getValue(idx) 函数,setValue(idx, value) 并不重要。
【问题讨论】:
-
压缩方案需要字节而不是整数。
-
...不使用数组?听起来像是 SQL/sqlite 的工作
-
需要对数据结构进行哪些操作(例如
get(index)、set(index, value)、...)? -
您只需要 [0-8] 范围内的值吗?然后我猜你可以使用一个字节数组每个字节存储两个数字(使用移位操作你可以做到这一点)。然后您可能需要将该逻辑包装在一个对象中,该对象通过虚拟索引(不是支持数组中的真实索引)为您提供 put/get 语义
-
您可以在内存中压缩,但您可能必须在每次访问或更改数据时解压缩重新压缩。压缩方案通常使用整个文件进行压缩。如果您的数据具有随机分布且未使用的空间很少,那么无论如何您都不会比您正在做的更好。
标签: java arrays performance compression