【发布时间】:2014-07-15 13:02:46
【问题描述】:
Java 的BitSet 在内存中,它没有压缩。
假设我在位图中有 10 亿个条目 - 内存中占用了 125 MB。 假设我必须对 10 个这样的位图进行 AND 和 OR 操作,它占用 1250 MB 或 1.3 GB 内存,这是不可接受的。 如何在不将它们未压缩在内存中的情况下对此类位图进行快速操作?
不知道bit-set中bit的分布情况。
我还查看了JavaEWAH,它是 Java BitSet 类的一个变体,使用运行长度编码 (RLE) 压缩。
有没有更好的解决方案?
【问题讨论】:
-
如果 AND 和 OR 只使用 2 个位图作为参数,为什么还要将 10 个位图保存在内存中?
-
把你的BitSet看成一组整数,它有多稀疏?也就是说,这个集合中存在多少个 BitSet 范围内的十亿个整数?
-
假设它们被缓存并在 10 个模块中使用。 @jean-loup
-
Java BitSet 数据结构非常接近于均匀分布的位集的最优值。如果你想做得更好,你需要知道你的比特集是如何分布的。
-
在这种情况下,我的下一步将是测量和分析,以了解更多有关数据及其用途的信息。