查表表大小减少

时间:2008-12-02 21:29:05

标签: lookup reduction

我有一个应用程序,我必须存储几百万个整数,我必须将它们存储在查找表中,显然我无法在内存中存储这么多数据,而且我的要求非常有限我必须将数据存储在一个嵌入式系统中,所以我在空间上非常有限,所以我想问一下我可以用来减少查找表的推荐方法。我不能使用函数逼近,如神经网络,值需要在表中。目前还不知道整数的范围。当我说整数时,我的意思是32位值。

基本上这个想法是使用一些copmpression方法来减少内存量但不会失去很多精度。这个东西需要在硬件中运行,因此计算开销不会很高。

在我的算法中,我必须访问表中的一个值,并使用它来更新值。最后我应该有一个函数,我将索引传递给它然后我得到一个值,然后我必须使用另一个函数在表中写一个值。

我发现了一个叫做tile编码http://www.cs.ualberta.ca/~sutton/book/8/node6.html,这个基于几个查找表,有没有人知道其他任何方法?。

感谢。

5 个答案:

答案 0 :(得分:1)

我会查看您需要存储的数字类型,并提取其中许多常见信息。例如,如果它们紧密聚集,您可以采用均值,存储它并存储偏移量。偏移将比原始数字具有更少的位。或者,如果它们或多或少均匀分布,您可以存储第一个数字,然后将偏移量存储到下一个数字。

知道查找数字的关键是有帮助的。

答案 1 :(得分:0)

我需要更多关于这个问题的细节。如果你不能存储整数的实际值而是近似值,那意味着你要减少(扔掉)一些数据(细节),对吗?我认为你正在寻找一个哈希,它本身可以是一个艺术形式。例如,假设您有32位值,一个散列将占用4个字节并将它们放在一起,这将导致单个8位值,从而将存储量减少4倍,但也会降低原始数据的实际值。通常你可以/可能会更进一步,也许只使用这些8位中的一些,比如说低4位,并进一步降低价值。

我认为我的真正问题是你需要数据,或者你不需要,如果你需要压缩数据或找到更多内存来存储数据。如果你不这样做,那么使用某种散列来减少位数,直到你达到存储的内存量。

答案 2 :(得分:0)

阅读http://www.cs.ualberta.ca/~sutton/RL-FAQ.html

  

“函数逼近”指的是   使用参数化的函数形式   代表价值功能   (和/或政策),而不是a   简单的表。“

也许这适用。此外,请使用其他事实更新您的问题 - 不要仅仅在评论中回答。


编辑。

位数组可以轻松存储数百万个数字中的每一个。假设您的数字在1到8百万之间。在一兆字节的存储空间中,您可以为集合中的每个数字设置1位,为每个不在您设置中的数字设置0。

如果您的数字在1到3百万之间,那么对于所有32M不同数字的大表,您将需要4Mb的内存。

请参阅我对Modern, high performance bloom filter in Python?的答案,了解无限大小位数组的Python实现。

答案 3 :(得分:0)

如果您只是在寻找bloom filter中存在的号码,那么您可能正在寻找。老实说,虽然你的问题相当模糊和令人困惑。这将有助于解释Q值是什么,以及在表中找到它们后如何处理它们。

答案 4 :(得分:0)

如果你的整数集是同质的,那么你可以尝试一个哈希表,因为你可以使用一个技巧来减少存储整数的大小,在你的情况下,减半。 假设整数n,因为它的集合是同质的,可以是散列。假设你有0x10000(16k)桶。每个桶索引,iBucket = n& FFFF。存储桶中的每个项目只需要存储16位,因为前16位是存储区索引。要使数据保持较小,您必须做的另一件事是将项目数放入存储桶中,并使用数组来保存存储桶中的项目。使用链表太大而且速度慢。当您迭代数组寻找匹配时,请记住您只需要比较存储的16位。

因此假设存储桶是指向数组和计数的指针。在32位系统上,最大为64位。如果int的数量足够小,我们可能会做一些奇特的事情,并使用32位的桶。 16k * 8字节= 524k,200万个短裤= 4mb。因此,这将为您提供一种查找整数和大约40%压缩的方法。