我正在寻找位图压缩算法,它允许我通过设置随机位来生成位图,我担心空间位图占用RAM的数量,例如。
存储1073741824位(大约10亿位)的未压缩位图需要大约128 MB的空间,而我根本没有那么多空间。我想在尽可能少的空间(RAM)中做到这一点。
我在其他人看了WAH,EWAH等(还没有仔细阅读过论文),但看起来他们是流压缩并且以压缩格式的位图随机设置位(虽然创建它)是不可能的(非常昂贵的操作)例如如果一个人想要设置100,200,300,那么它是有效的,但是如果要求设置为100th,200th,105th,3000th,1999th那么那是不可能的。
在我的情况下,对于所有位,只能随机获得设置哪个位和未设置哪个位的信息,例如如果我正在做一些操作1073741824次,我需要根据操作结果设置任何位,它们不会按顺序递增。
这是正确的还有替代方案吗?
摘要:在随机设置位时创建压缩位图的算法。没有可用的熵/模式信息。分配可以是任何东西。
目标:节省内存的最佳算法。 通过设置随机位来减少位图占用的内存。
答案 0 :(得分:3)
我们通过咆哮位图获得了良好的效果:http://roaringbitmap.org/
答案 1 :(得分:0)
如果事先不知道任何模式,并且您的工作记忆很少,则以下情况应该没问题:
将图像平铺成小部分(线条或矩形图块)。这些部分应该足够小,以便您可以快速解压缩,设置位和压缩。它们应该足够大,能够为编码器提供足够的数据来实际编码(64KB?)。您可以使用任何压缩算法,如Deflate或LZMA(7-zip)。
将传入的位暂时放入列表中。一旦该列表填满(可能占用1MB的空间?),您需要将这些位复制到位图的各个部分。完成后,您可以清除列表。该列表只是一个临时缓冲区,允许将每个部分的许多更新批量分配到一个解压缩 - 压缩循环中。
在写出比特之前,按部分和位置对它们进行排序。这使您可以清除重复项并仅处理所有部分。
注意,不能保证,甚至可以进行压缩。如果没有可压缩的图案,则无法压缩。