2012-08-06 91 views
5

Estoy intentando comprender mejor cómo el memmap de numpy maneja vistas de archivos muy grandes. La secuencia de comandos a continuación se abre una memoria mapeada 2048^3 matriz y copia una vista downsampled 128^3 de la mismaComprender el rendimiento de 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 

Por lo general, esta opción se imprime Time (ms): 80 más o menos. Sin embargo, si cambio la opinión de asignación a

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

y ejecutarlo tres veces, me sale el siguiente:

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

nadie entiende por qué la primera invocación es mucho más lento?

Respuesta

3

El sistema operativo aún tiene partes (o todos) del archivo asignado disponible en la memoria caché en la memoria RAM física. La lectura inicial tiene que acceder al disco, que es un lote más lento que el acceso a la RAM. Haga suficiente otro disco IO, y encontrará que volverá más cerca de su tiempo original, donde el sistema operativo tiene que volver a leer los bits que no ha guardado en la memoria caché de nuevo ...

+1

Tenga en cuenta que un cambio de 1 en la dimensión más estriada dará como resultado un desplazamiento de 32MB, que será suficiente para que las lecturas provengan de un conjunto de páginas disjuntas. – ecatmur

+0

Gracias por la explicación: no me di cuenta de que el sistema operativo podría almacenar en caché resultados como este – ChrisB

Cuestiones relacionadas