在小内存中表示非常大的位数组

时间:2011-02-12 23:19:23

标签: c bitmap bit

我想将包含250 M个状态(每个1位)的结构表示为尽可能少的内存(最多100 k)。对它的操作是设置/获取。我冷不说它密集或稀疏,它可能会有所不同。 我想要使​​用的语言是C.

我在这里查看其他线程也找到了合适的东西。例如布隆过滤器之类的概率结构因为可能的错误答案而不合适。

有什么建议吗?

6 个答案:

答案 0 :(得分:1)

如果您知道您的数据可能稀疏,那么您可以使用run-length encoding。但除此之外,你无法压缩它。

答案 1 :(得分:0)

我认为不可能做你要问的事。如果你需要覆盖每个1位的2.5亿个状态,你需要250Mbits / 8 = 31.25MBytes。与100KBytes相差无几。

您通常会创建一个大型字节数组,并使用函数来确定要设置/清除/获取的字节(index >> 3)和位位置(index & 0x07)。

答案 2 :(得分:0)

250M位将需要31.25兆字节存储(假设当前为8位/字节),远远超过您的100k目标。

击败它的唯一方法是开始利用数据中的某些稀疏性或模式。

答案 3 :(得分:0)

结构的大小取决于信息的熵。如果没有重复模式,则无法以小于给定大小的方式压缩信息。在您的情况下,最坏的情况仍然是大约32Mb的存储空间。如果你对这些位之间的关系有所了解,那么它可能是......

答案 4 :(得分:0)

在100K的mem中可以存储的最大位数是819,200位。假设1 K = 1024字节,1字节= 8位。

答案 5 :(得分:0)

您的环境中可能存在文件吗? 如果是这样,你可能会交换,例如4k大小的分段位缓冲区。 你的解决方案应该以序列化的方式访问这些位 最小化磁盘加载/保存操作。