2013-11-24 44 views
1

所以我有一個非常大的矩陣(120000 x 120000),並且在整個矩陣上運行一個腳本,將一個元素與每個其他元素進行比較。因爲我無法在內存中保存整個內容,所以我使用了memmap。我還會定期刷新矩陣,以確保計算機崩潰或不丟失所有數據。但是,我注意到,我進入矩陣的「更深層次」,可以說,刷新數據所花費的時間增加了。最終,最多需要五分鐘來保存我的結果。有人知道爲什麼它這樣做?有沒有更好的方法可以做到這一點?我會發布一些代碼,但我相當肯定我沒有做任何「錯誤」的事情。Mem-map在矩陣深處減速

OUT_DIR = '/media/sf_3dAnalysis/simMatrix/' 
SIM_FILE = 'similarity.npy' 
data = np.lib.format.open_memmap(OUT_DIR+SIM_FILE, mode='w+', dtype='float32', shape=(120821,120821)) 
#After processing a certain amount of indices, I go to flush the data. 
data.flush() 

回答

0

mmap很適合用於引用小型地點的問題 - 一種適合物理學的問題。但是,這聽起來像是你正在使用mmap處理53千兆字節的數據,並且引用的局部性不好。

如果您致力於mmap,那麼您可能不得不接受一點此工作負載的性能損失。

一兩件事,這可能有助於一些,正在寫一類,將讓儘可能多的矩陣的儘可能在內存中(也許是第一行),並把其餘的磁盤上(該行的其餘部分),未緩存(可能使用O_DIRECT)。

在你的情況下,緩存整個事情可能只會導致虛擬內存抖動,除非你有一個非常大的physmem。然而,如果你有預算,53+演出的物理可能不是遙不可及。

如果你決定去O_DIRECT路線,檢查了這一點: http://stromberg.dnsalias.org/~strombrg/odirect/

+0

你有除了MMAP爲我做的任務,任何其他建議? – drizzle123