2012-08-06 24 views
5

Tôi đang cố gắng hiểu rõ hơn cách bản ghi nhớ của numpy xử lý các lượt xem các tệp rất lớn. Kịch bản dưới đây sẽ mở ra một bộ nhớ ánh xạ 2048^3 mảng, và các bản sao một downsampled 128^3 điểm của nóHiểu hiệu suất của bản ghi nhớ cục bộ

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 

Thông thường, đây in Time (ms): 80 hoặc lâu hơn. Tuy nhiên, nếu tôi thay đổi sự phân công nhằm

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

và chạy nó ba lần, tôi nhận được như sau:

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

Có ai hiểu tại sao gọi đầu tiên là quá chậm hơn?

Trả lời

3

Hệ điều hành vẫn có các phần (hoặc tất cả) tệp được ánh xạ sẵn có được lưu trong bộ nhớ cache trong RAM vật lý. Lần đọc đầu tiên phải truy cập vào đĩa, chậm hơn lot so với truy cập RAM. Làm đủ IO ​​đĩa khác, và bạn sẽ thấy rằng bạn sẽ nhận được trở lại gần gũi hơn với thời gian ban đầu của bạn, nơi hệ điều hành phải đọc lại bit nó đã không lưu vào ổ đĩa một lần nữa ...

+1

Lưu ý rằng một sự thay đổi của 1 trong kích thước được kéo dài nhất sẽ dẫn đến một sự thay đổi 32MB, mà sẽ là đủ mà đọc của bạn đến từ một tập hợp các trang. – ecatmur

+0

Cảm ơn bạn đã giải thích - Tôi đã không nhận ra rằng hệ điều hành có thể lưu trữ kết quả như thế này – ChrisB

Các vấn đề liên quan