Giả sử tôi có tập dữ liệu là mảng inte 1e12 32 bit (4 TB) được lưu trữ trong tệp trên hệ thống tệp HDD 4TB 4TB.Linux: mảng int lớn: mmap vs tìm kiếm tệp?
Hãy xem xét dữ liệu có nhiều khả năng ngẫu nhiên nhất (hoặc ít nhất là dường như ngẫu nhiên).
// pseudo-code
for (long long i = 0; i < (1LL << 40); i++)
SetFileIntAt(i) = GetRandInt();
Hơn nữa, hãy xem xét rằng tôi muốn đọc các phần tử riêng lẻ theo thứ tự không thể đoán trước và thuật toán chạy không chính xác (đang diễn ra).
// pseudo-code
while (true)
UseInt(GetFileInt(GetRand(1<<40)));
Chúng tôi đang sử dụng Linux x86_64, gcc. Bạn có thể giả định hệ thống có 4GB RAM (tức là 1000x ít hơn bộ dữ liệu)
Sau đây là hai cách tiếp cận kiến trúc sư:
(A) mmap tập tin đến một khối 4TB bộ nhớ và truy cập nó như một int array
(B) mở (2) tệp và sử dụng tìm kiếm (2) và đọc (2) để đọc int.
Ngoài A và B sẽ có hiệu suất tốt hơn ?, và tại sao?
Có thiết kế nào khác có hiệu suất tốt hơn A hoặc B không?
Tốc độ truy cập RAM lớn hơn tốc độ truy cập HD (một số bậc độ lớn, do thiếu bộ phận cơ khí). NẾU bạn không có vấn đề về bộ nhớ, ánh xạ tất cả các tập tin trong RAM là giải pháp tốt nhất bạn có thể có. Bạn cũng có thể xem xét ổ đĩa trạng thái rắn (rất giống với RAM). Hơn nữa, nếu truy cập ngẫu nhiên có nghĩa là truy cập ngẫu nhiên, bạn có thể tắt bộ nhớ cache để cải thiện một số hiệu suất (nghĩa là, nếu xác suất truy cập vào cùng một phần tử rất thấp, không hữu ích khi tìm kiếm trong bộ nhớ cache). –
@D. Cannone Giữ bộ nhớ cache cho một mục đích khác khi thực hiện truy cập ngẫu nhiên chỉ là billiant, cảm ơn! – Benoit
#C sẽ tải nó từ mạng với một số loại công nghệ bỏ qua hạt nhân (nói RDMA trên infiniband). Nó sẽ ở đâu đó giữa A và B. – bobah