5

numpyのmemmapが非常に大きなファイルのビューをどのように処理するかをよりよく理解しようとしています。以下のスクリプトは、メモリマップされた2048 ^ 3配列を開き、ダウンサンプリングされた128^3ビューをコピーします。

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かそこらを印刷します。ただし、ビューの割り当てをに変更すると

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

それを3回実行すると、次のようになります。

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

最初の呼び出しが非常に遅い理由を誰かが理解していますか?

4

1 に答える 1

5

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

于 2012-08-06T16:36:00.970 に答える