我一直在研究一个我认为人们可能会感兴趣的问题(也许有人知道预先存在的解决方案)。大数据集的高效重新排序以最大化内存缓存效率
我有一个大的数据集,包括对指针的对象一长串的,是这样的:
[
(a8576, b3295),
(a7856, b2365),
(a3566, b5464),
...
]
有太多的对象在内存中保留在任何时间(可能是数百个千兆字节),因此它们需要存储在磁盘上,但可以缓存在内存中(可能使用LRU缓存)。
我需要运行这个列表处理每一对,这需要对中的两个对象都加载到内存中(如果它们尚未被缓存)。
因此,问题是:有没有一种方法可以对列表中的对进行重新排序,以最大限度地提高内存缓存的效率(换言之:最大限度地减少缓存未命中次数)?
注
显然,重新排序的算法应该是尽可能地快,而不应依赖于能够在内存中的整个列表一次(因为我们不”没有足够的内存) - 但它可以在需要的时候多次迭代列表。
如果我们在处理单个对象而不是对,那么简单的答案就是对它们进行排序。在这种情况下,这显然不起作用,因为您需要考虑对中的两个元素。
该问题可能与该找minimum graph cut的,但即使问题是等价的,我不认为解决方案,以最小切割满足
我的假设是,启发式会在流将数据从磁盘中取出,并以更好的顺序将其重新写入块中。它可能需要迭代几次。
其实它可能不只是成对,它可能是三胞胎,四胞胎或更多。我希望能够很容易地推广一种可以简化对的算法。
访问第一个或第二个对象的成本是相同的。在一般情况下,我仍然乐观地认为有办法回答这个问题 - 就像最小图形切割这样的问题确实有一般情况下的解决方案。 – sanity 2009-01-31 22:44:01