2012-08-06 87 views
5

我在努力更好地理解numpy的memmap如何处理非常大的文件的视图。下面的脚本打开存储器映射2048^3阵列,并复制它的一个下采样128^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左右。但是,如果我改变了看法分配

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

并运行了三次,我得到如下:

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

有谁明白为什么第一次调用是这么多慢?

回答

3

操作系统仍然有部分(或全部)可用缓存在物理RAM中的映射文件。初始读取必须访问磁盘,这比访问RAM慢批次。做足够的其他磁盘IO,你会发现你会更接近你原来的时间,操作系统必须重新读取它没有从磁盘再缓存的位...

+1

请注意,在最大跨度维度中的1将导致32MB的移位,这足以使您的读取来自不相交的一组页面。 – ecatmur 2012-08-06 16:50:32

+0

感谢您的解释 - 我没有意识到操作系统可以像这样缓存结果 – ChrisB 2012-08-06 17:07:09