我一直在研究一個我認爲人們可能會感興趣的問題(也許有人知道預先存在的解決方案)。大數據集的高效重新排序以最大化內存緩存效率
我有一個大的數據集,包括對指針的對象一長串的,是這樣的:
[
(a8576, b3295),
(a7856, b2365),
(a3566, b5464),
...
]
有太多的對象在內存中保留在任何時間(可能是數百個千兆字節),因此它們需要存儲在磁盤上,但可以緩存在內存中(可能使用LRU緩存)。
我需要運行這個列表處理每一對,這需要對中的兩個對象都加載到內存中(如果它們尚未被緩存)。
因此,問題是:有沒有一種方法可以對列表中的對進行重新排序,以最大限度地提高內存緩存的效率(換言之:最大限度地減少緩存未命中次數)?
注
顯然,重新排序的算法應該是儘可能地快,而不應依賴於能夠在內存中的整個列表一次(因爲我們不」沒有足夠的內存) - 但它可以在需要的時候多次迭代列表。
如果我們在處理單個對象而不是對,那麼簡單的答案就是對它們進行排序。在這種情況下,這顯然不起作用,因爲您需要考慮對中的兩個元素。
該問題可能與該找minimum graph cut的,但即使問題是等價的,我不認爲解決方案,以最小切割滿足
我的假設是,啓發式會在流將數據從磁盤中取出,並以更好的順序將其重新寫入塊中。它可能需要迭代幾次。
其實它可能不只是成對,它可能是三胞胎,四胞胎或更多。我希望能夠很容易地推廣一種可以簡化對的算法。
訪問第一個或第二個對象的成本是相同的。在一般情況下,我仍然樂觀地認爲有辦法回答這個問題 - 就像最小圖形切割這樣的問題確實有一般情況下的解決方案。 – sanity 2009-01-31 22:44:01