2012-06-14 38 views
15

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?

+2

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). –

+0

@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

+0

#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

Trả lời

1

Tôi muốn nói hiệu suất phải tương tự nếu quyền truy cập thực sự là ngẫu nhiên. Hệ điều hành sẽ sử dụng một chiến lược bộ nhớ đệm tương tự cho dù trang dữ liệu được ánh xạ từ một tệp hay dữ liệu tệp được lưu trữ đơn giản mà không có sự kết hợp với RAM.

Giả sử bộ nhớ cache là không hiệu quả:

  • Bạn có thể sử dụng fadvise tuyên bố mô hình truy cập của bạn trước và vô hiệu hóa readahead.
  • Do ngẫu nhiên bố cục không gian địa chỉ, có thể không có khối tiếp giáp 4 TB trong không gian địa chỉ ảo của bạn.
  • Nếu tập dữ liệu của bạn mở rộng, vấn đề về không gian địa chỉ có thể trở nên cấp bách hơn.

Vì vậy, tôi muốn đọc rõ ràng.

3

Một mặt, bạn có sử dụng rộng rãi hoán đổi bộ nhớ dẫn đến số trang nhỏ, minh bạch cho ứng dụng. Mặt khác, bạn có nhiều cuộc gọi hệ thống , với chi phí đã biết. Trang Wikipedia về memory-mapped file dường như khá rõ ràng đối với tôi, nó duyệt một cách toàn diện ưu và nhược điểm.

Tôi nghĩ kiến ​​trúc 64 bit + cuộc gọi tệp lớn cho phương pháp tiếp cận tệp ánh xạ bộ nhớ, ít nhất là để tránh làm phức tạp ứng dụng; Tôi đã được nói rằng sự phức tạp thường dẫn đến hiệu suất kém. Tuy nhiên mmap() là bình thường đối với truy cập tuần tự, mà không phải là mục đích ở đây.

Vì đây là truy cập ngẫu nhiên thuần túy, có rất ít khả năng hai lần truy cập sẽ ở trong cùng một trang được nạp RAM. Một trang 4kb đầy đủ sẽ được hoán đổi từ ổ cứng sang RAM, chỉ với một dữ liệu 4 byte ... Đây là vô số các xe buýt tải và có thể sẽ dẫn đến màn trình diễn kém.

Hy vọng trợ giúp này.

+0

Vì không có đĩa cứng cho phép đọc hoặc viết ít hơn một khối, Có thực sự không có cách nào để làm một đĩa đọc ít hơn 512 byte bất cứ điều gì bạn làm ngay cả khi bạn sử dụng truy cập thô/viết một tùy chỉnh hệ điều hành vv. Đọc tối thiểu cho phép bởi hệ thống tập tin có thể cao hơn. – camelccc

1

Có thể cho tập dữ liệu tuyến tính 4TB, bạn không cần hệ thống tệp. Tôi đoán truy cập thiết bị thô có thể mang lại một số lợi ích hiệu suất.

Cũng có thể có cách tối ưu hóa truy vấn hoặc cấu trúc dữ liệu để bộ nhớ đệm có thể được sử dụng hiệu quả hơn?

+0

Tập dữ liệu "tuyến tính" là gì? –

+0

"tuyến tính" theo nghĩa là nó là một mảng lớn với chỉ mục tuyến tính. Để lấy phần tử thứ N, bạn giải quyết nó ở độ lệch N * sizeof (phần tử). –

+0

Nó sẽ không tuyến tính nếu nó chứa nhiều mảng, cộng với một số chỉ mục băm hoặc btree, giao dịch, vv :) ​​ –

1

Hiệu suất tìm kiếm phụ thuộc rất lớn vào việc triển khai hệ thống tệp của bạn. Ext4 phải là một lựa chọn tốt vì nó sử dụng extent trees. Ngoài ra nếu tệp của bạn có phân bổ liền kề tuyến tính thì cây mức độ sẽ bao gồm một mục duy nhất, điều này khiến cho việc tìm kiếm hiệu quả một cách đáng kể.

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