我有一個算法,我需要計算大對象之間的所有成對距離(其中距離是一個真實的度量,因此dist(a,b) == dist(b,a)
,在所有其他度量要求之間)。我有大約一千個物體,所以我需要計算大約500,000個距離。有幾個問題:最大限度地減少大負載數的算法
- 所有這1000個對象都是序列化的,坐在磁盤上的單個文件中。
- 與相對平凡的距離計算相比,從磁盤讀取數據是一項巨大的操作。
- 我不能在所有的內存中同時進行交換,然後顛簸。我一次可以存儲500個內存。
- 這意味着在某些時候,我需要在先前讀取並釋放內存之後,將對象重新讀入內存。
因此,鑑於從磁盤讀取是瓶頸,並且我無法一次讀取超過一半的數據,任何人都可以考慮讀取和釋放這些對象的算法,從而最大限度地減少總讀取次數?
我認爲在上半年閱讀,做所有這些成對的距離,釋放所有的內存和閱讀下半年,然後做所有這些成對的距離。在這一點上,我仍然需要前半部分物體和第二部分物體之間的距離,我不知道該做什麼。我還考慮過有一個緩存,當滿的時候,隨機選擇一個當前對象驅逐並讀取下一個對象,但我覺得必須有更好的選擇。我認爲像LRU這樣的東西,但它可能會導致所需對象在最後一次計算時被驅逐的行爲。
總而言之,我有點卡住了。有什麼建議?
你可以嘗試讓它們適合內存:-)或者買雙倍的內存!第一種選擇通常可以通過作弊一點點。例如,通過將它們「壓縮」在內存中,或者對某些數據進行重複數據刪除。 – xanatos
Re:你的想法是「成對的」,你會把總數分成四個部分。檢查A-> B,A-> C,A-> D,然後B-> C,B-> D,最後檢查C-> D。這應該涵蓋所有可能性。 (不知道它的實際效率。) – usr2564301
距離計算是否需要所有對象屬性? –