2013-05-03 46 views
11

Khi tên tệp ánh xạ bộ nhớ cho biết, tôi hiểu rằng một phần của tệp lớn có thể được ánh xạ tới bộ nhớ bằng cách sử dụng lớp MemoryMappedFile trong C# để xử lý dữ liệu nhanh. Những gì tôi muốn làm với bộ nhớ ánh xạ tập tin là để xử lý song song bộ nhớ ánh xạ. Để thực hiện điều đó, tôi có các câu hỏi sauLàm thế nào để xử lý song song dữ liệu trong tệp ánh xạ bộ nhớ

  1. MemoryMappedFileViewAccessor an toàn chủ đề và song song.For-an toàn? Tôi thực sự đã thực hiện một chương trình demo để kiểm tra câu hỏi và có vẻ như nó đang hoạt động. Nhưng không thể tìm thấy bất kỳ tài liệu tham khảo về điều này. Nếu câu trả lời là có, tôi đã làm xong. Nếu không,
  2. Có cách nào để truy cập trực tiếp vào bộ nhớ được ánh xạ với mảng không? Tôi biết MemoryMappedFileViewAccessor có phương pháp ReadArray nhưng sử dụng phương pháp là nhân bản bộ nhớ.
+0

xử lý song song của bạn có liên quan đến việc sửa đổi tệp hoặc chỉ đọc từ tệp đó không? –

+0

@CharlesLambert Không, việc xử lý dữ liệu liên quan đến hoạt động của accessor.Write hoặc accessor.Read mà về cơ bản là truy cập vào bộ nhớ ánh xạ. Bộ nhớ ánh xạ tập tin thực sự chăm sóc hoạt động tập tin. –

Trả lời

9

Bạn có thể giải thích điều này. Tệp ánh xạ bộ nhớ chỉ là một đoạn bộ nhớ trong chương trình của bạn mà byte có thể truy cập được bằng nhiều quá trình. Chúng khá lúng túng trong mã được quản lý vì đoạn này tồn tại ở một địa chỉ cụ thể. Mà đòi hỏi phải truy cập dữ liệu bằng cách sử dụng một con trỏ, họ là điều cấm kỵ trong mã được quản lý. MemoryMappedFileViewAccessor kết thúc tốt đẹp con trỏ đó, nó bản sao dữ liệu từ bộ nhớ được quản lý vào bộ nhớ dùng chung. Hãy lưu ý rằng điều này đánh bại lý do chính để sử dụng MMF và tại sao sự hỗ trợ của họ mất quá nhiều thời gian để hiển thị trong .NET. Hãy chắc chắn rằng bạn không muốn sử dụng các đường ống được đặt tên thay thế.

Vì vậy, lý do này ra, một MMF chắc chắn không phải là thread-an toàn bởi thiết kế vì đây là bộ nhớ chia sẻ, giống như các biến toàn cầu có trong mã của bạn. Mọi thứ diễn ra sai cùng một cách nếu các chủ đề đọc và viết cùng một phần của bộ nhớ dùng chung. Và bạn phải bảo vệ chống lại chính xác như vậy là tốt, một khóa để đảm bảo chỉ có một sợi có thể truy cập một phần được chia sẻ.

Cũng lưu ý rằng bạn cần triển khai khóa đó giữa các quy trình đọc và ghi MMF. Mà có xu hướng đau đớn, bạn phải sử dụng một mutex tên mà quá trình "master" tạo ra và quá trình "nô lệ" mở ra. Bạn không thể tiết kiệm được yêu cầu khóa đó. Đáng chú ý là bạn không bao giờ đề cập đến việc chăm sóc này trong câu hỏi của bạn, do đó, Red Flag ở đó.

Trong một quy trình, các chuỗi không truy cập vào cùng một phần của MMF không thể theo cách khác.Giống như hai chuỗi truy cập các biến số khác nhau không yêu cầu bất kỳ đồng bộ hóa nào. Miễn là chúng giữ được mutex để đảm bảo rằng một quá trình khác không thể ghi vào phần đó. Lưu ý rằng điều này có thể có nghĩa là bạn muốn sử dụng Semaphore để bảo vệ quyền truy cập MMF, một Mutex chỉ có thể được mua bởi một luồng.

3

Nội bộ, MemoryMappedViewAccessor được lấy từ UnmanagedMemoryAccessor, xuất hiện không thay đổi, mặc dù không có trường chỉ đọc - ít nhất nó không sửa đổi các trường hiện có trong khi đọc/ghi. Đến lượt mình, nó đọc bộ nhớ ánh xạ dữ liệu tập tin từ SafeBuffer lớp, trong đó có chứa văn bản sau vào comments header:

/* Keep the penalties for using this class small, both in terms of space 
// and time. Having multiple threads reading from a memory mapped file 
// will already require 2 additional interlocked operations. If we add in 
// a "current position" concept, that requires additional space in memory and 
// synchronization. Since the position in memory is often (but not always) 
// something that can be stored on the stack, we can save some memory by 
// excluding it from this object. However, avoiding the need for 
// synchronization is a more significant win. This design allows multiple 
// threads to read and write memory simultaneously without locks (as long as 
// you don't write to a region of memory that overlaps with what another 
// thread is accessing). 

Vì vậy, tôi đoán là các hoạt động với bộ nhớ ánh xạ các tập tin được thread-safe, mặc dù nó là lạ mà không có xác nhận điều này trong MSDN.

0

1) bang MSDN cho cả MemoryMappedFileMemoryMappedViewAccessor rằng:

Bất kỳ public static (chung trong các thành viên Visual Basic) của loại này là chủ đề an toàn. Bất kỳ thành viên cá thể nào cũng không được bảo đảm là luồng an toàn.

2) điểm của MemoryMappedFile không phải là để giảm phân bổ bộ nhớ. Nếu bạn đang đọc tệp từ đĩa, bạn sẽ phải cấp phát bộ nhớ để lưu trữ các mục bạn đã đọc ra khỏi tệp. Đây cũng là trường hợp với tệp ánh xạ bộ nhớ cũng như

+0

@Thomas Tập tin ánh xạ bộ nhớ vẫn tiêu thụ không gian địa chỉ, tất nhiên. Trong thực tế, một tệp ánh xạ bộ nhớ chưa đặt tên không phải là rất khác với phân bổ bộ nhớ OS cấp thấp của cùng một mức độ chi tiết. – Neil

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