2012-08-06 32 views
5

numpyのmemmapが非常に大きなファイルのビューをどのように扱うかを理解しようとしています。スクリプトは、以下のメモリが2048^3アレイ、コピーnumpy memmapのパフォーマンスを理解する

import numpy as np 
from time import time 

FILE = '/Volumes/BlackBox/test.dat' 
array = np.memmap(FILE, mode='r', shape=(2048,2048,2048), dtype=np.float64) 

t = time() 
for i in range(5): 
    view = np.array(array[::16, ::16, ::16]) 
t = ((time() - t)/5) * 1000 
print "Time (ms): %i" % t 

通常、これはTime (ms): 80ほど印刷それのダウンサンプリング128^3ビューをマッピングし開き。しかし、私は

view = np.array(array[1::16, 2::16, 3::16]) 

にビューの割り当てを変更し、それを3回実行した場合、私は以下の取得:最初の呼び出しがそんなに遅い理由

Time (ms): 9988 
Time (ms): 79 
Time (ms): 78 

誰もが理解していますか?

答えて

3

OSには、物理​​RAMにキャッシュされているマップされたファイルの一部(またはすべて)が残っています。最初の読み取りはディスクにアクセスする必要があります.ロットはRAMにアクセスするよりも遅いです。十分に他のディスクIOを実行すれば、元の時間に近づき、OSは再びディスクからキャッシュされていないビットを再読み込みする必要があります。

+1

シフト最もストライドされたディメンションの1の値が32MBのシフトになります。これは読み込みが不連続なページから来るのに十分です。 – ecatmur

+0

説明をいただきありがとうございます - 私はOSがこのような結果をキャッシュすることを認識しませんでした – ChrisB

関連する問題