我一直在研究一个我认为人们可能会感兴趣的问题(也许有人知道预先存在的解决方案)。
我有一个大型数据集,由一长串指向对象的指针组成,如下所示:
[
(a8576, b3295),
(a7856, b2365),
(a3566, b5464),
...
]
任何时候都有太多的对象需要保存在内存中(可能有数百 GB),因此它们需要存储在磁盘上,但可以缓存在内存中(可能使用 LRU 缓存)。
我需要遍历这个列表来处理每一对,这需要将这对中的两个对象都加载到内存中(如果它们还没有缓存在那里)。
所以,问题是:有没有办法重新排序列表中的对以最大化内存缓存的有效性(换句话说:最小化缓存未命中的数量)?
笔记
显然,重新排序算法应该尽可能快,并且不应该依赖于能够一次将整个列表保存在内存中(因为我们没有足够的 RAM)——但它可以迭代必要时列出数次。
如果我们处理的是单个对象,而不是对,那么简单的答案就是对它们进行排序。这显然在这种情况下不起作用,因为您需要考虑这对中的两个元素。
问题可能与找到最小图割有关,但即使问题是等价的,我认为最小割的解决方案也不满足
我的假设是启发式方法会将数据从磁盘中流出,并以更好的顺序将其分块写回。它可能需要多次迭代。
实际上,它可能不仅仅是成对的,它可能是三胞胎、四胞胎或更多。我希望对对执行此操作的算法可以很容易地推广。