2012-08-06 10 views
5

Sto cercando di capire meglio come memmap di numpy gestisce le viste di file molto grandi. Lo script di seguito apre una memoria mappata 2048^3 matrice, e copia un ricampionate 128^3 vista di essoCapire le prestazioni di 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 

Solitamente, questa stamperà Time (ms): 80 o così. Tuttavia, se cambio l'incarico al fine di

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

ed eseguirlo tre volte, ottengo il seguente:

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

Qualcuno capire perché la prima invocazione è tanto più lento?

risposta

3

Il sistema operativo ha ancora parti (o tutto) del file mappato disponibile memorizzato nella RAM fisica. La lettura iniziale deve accedere al disco, che è un lotto più lento dell'accesso alla RAM. Fai abbastanza altro IO del disco e scoprirai che tornerai più vicino all'orario originale, in cui il sistema operativo deve rileggere i bit che non ha ancora memorizzato nella cache dal disco ...

+1

Nota che un turno di 1 nella dimensione più striata provocherà uno spostamento di 32 MB, che sarà sufficiente per far sì che le letture provengano da un insieme di pagine disgiunte. – ecatmur

+0

Grazie per la spiegazione: non mi ero reso conto che il sistema operativo poteva memorizzare risultati come questo – ChrisB