我有以下三维位数组(用于bloom filter):
unsigned char P_bit_table_[P_ROWS][ROWS][COLUMNS];

P_ROWS的维数表示独立的二维位数组(即P_ROWS、P_ROWS1、P_ROWS2是独立的位数组),可以大到100MB,并且包含独立填充的数据。我要查找的数据可能在这些P_ROWS中的任何一个中,现在我正在独立地搜索它,它是P_ROWS,然后是P_ROWS1,依此类推,直到我得到肯定或直到它结束(P_ROWSn-1)。这意味着如果n是100,我必须进行这种搜索(比特比较) 100次(并且这种搜索是经常进行的)。有人建议,如果我可以进行位分组(在行-主顺序数组上使用列-主顺序--我不知道怎么做),我就可以提高搜索性能。
我真的需要提高搜索的性能,因为程序做了很多事情。
如果需要,我很乐意给出我的位表实现的更多细节。
抱歉,我的语言太差了。
谢谢你的帮助。
编辑:位分组可以按以下格式完成:假设数组为:
unsigned char P_bit_table_[P_ROWS][ROWS][COLUMNS]={{(a1,a2,a3),(b1,b2,b3),(c1,c2,c3))},
{(a1,a2,a3),(b1,b2,b3),(c1,c2,c3))},
{(a1,a2,a3),(b1,b2,b3),(c1,c2,c3))}};如您所见,所有行--在第三个维度上--都有相似的数据。分组后我想要的是这样的:所有的a1都在一个组中(作为一个实体,以便我可以将它们与另一个比特进行比较,以检查它们是开还是关),并且所有的b1都在另一个组中,依此类推。
发布于 2012-01-27 00:44:26
重用别人的算法
有大量的bit-calculation optimizations out there,包括许多不明显的,例如Hamming Weights和用于查找下一个真或假位的专门算法,它们相当独立于您的数据结构。
重用其他人编写的算法确实可以加快计算和查找速度,更不用说开发时间了。有些算法是如此专门化,它们使用的计算魔法会让你抓狂:在这种情况下,你可以相信作者的话(在你用单元测试确认它们的正确性之后)。
利用CPU缓存和多线程
我个人将我的多维位数组减少到一维,针对预期的遍历进行了优化。
这样,命中CPU缓存的可能性就更大了。
在您的情况下,我还会深入考虑数据的可变性,以及您是否希望在位块上设置锁。有了100MB的数据,你就有可能使用多个线程并行运行你的算法,如果你能组织你的数据和算法来避免争用的话。
如果您按线程划分数据块的所有权,那么您甚至可以拥有一个无锁模型,这样就没有两个线程可以对同一个块进行读写。这完全取决于您的需求。
现在是思考这些问题的好时机。但由于没有人比您更了解您的数据和使用情况,因此您必须在您的数据和使用模式的上下文中考虑设计选项。
https://stackoverflow.com/questions/9017804
复制相似问题