2012-08-06 9 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 या तो इसके बारे में एक downsampled 128^3 दृश्य।

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

किसी को समझ में है कि क्यों पहले मंगलाचरण तो बहुत धीमी है: हालांकि, अगर मैं

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

और इसे चलाने के लिए दृश्य काम तीन बार बदलने के लिए, मैं निम्नलिखित मिल सकता है?

उत्तर

3

ओएस में अभी भी मैप किए गए फ़ाइल के भाग (या सभी) भौतिक RAM में कैश किए गए हैं। प्रारंभिक पढ़ने को डिस्क तक पहुंचने के लिए है, जो लॉट रैम तक पहुंचने से धीमा है। पर्याप्त अन्य डिस्क IO करें, और आप पाएंगे कि आप अपने मूल समय के करीब वापस आ जाएंगे, जहां ओएस को बिट्स को दोबारा पढ़ना होगा, फिर से डिस्क से कैश नहीं किया गया है ...

+1

ध्यान दें कि एक शिफ्ट सबसे अधिक गतिशील आयाम में से 1 का परिणाम 32 एमबी की शिफ्ट होगी, जो पर्याप्त होगा कि आपके पढ़ने पृष्ठ के एक अलग सेट से आते हैं। – ecatmur

+0

स्पष्टीकरण के लिए धन्यवाद - मुझे एहसास नहीं हुआ कि ओएस इस तरह के परिणाम कैश कर सकता है – ChrisB