2012-07-09 36 views
8

Tôi đang sử dụng các tệp ánh xạ bộ nhớ để có quyền truy cập đọc/ghi vào một số lượng lớn tệp hình ảnh (~ 10000 x 16 MB) trong Windows 7 64 bit. Mục tiêu của tôi là:Làm thế nào để không đồng bộ tuôn ra một tập tin ánh xạ bộ nhớ?

  1. Có càng nhiều dữ liệu được lưu trong bộ nhớ cache càng tốt.

  2. Có thể phân bổ hình ảnh mới và ghi vào hình ảnh nhanh nhất có thể.

Vì vậy, tôi đang sử dụng tệp ánh xạ bộ nhớ để truy cập tệp. Caching hoạt động tốt, nhưng hệ điều hành này không xóa các trang bẩn cho đến khi tôi gần hết bộ nhớ vật lý. Do đó việc phân bổ và ghi vào các tệp mới là khá chậm khi bộ nhớ vật lý được lấp đầy.

Một giải pháp sẽ là sử dụng thường xuyên FlushViewOfFiles(), nhưng chức năng này không trả lại cho đến khi dữ liệu được ghi vào đĩa.

Có cách nào để đồng bộ hóa ánh xạ tệp không đồng bộ không? Giải pháp duy nhất tôi tìm thấy là Unmap()MapViewOfFile() một lần nữa, nhưng sử dụng cách tiếp cận này tôi không thể chắc chắn để có được con trỏ dữ liệu giống nhau một lần nữa. Ai đó có thể đề xuất một cách tiếp cận tốt hơn?

Edit: Đọc tài liệu WINAPI lâu hơn một chút, có vẻ như tôi tìm thấy một giải pháp thích hợp cho vấn đề của tôi:

Calling VirtualUnlock() trên một phạm vi bộ nhớ mà không bị khóa kết quả trong một xả của các trang bẩn.

Trả lời

2

Tôi nghe nói rằng hàm FlushViewOfFile() KHÔNG đợi cho đến khi nó ghi vào tập tin.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366563(v=vs.85).aspx

Chức năng FlushViewOfFile không tuôn siêu dữ liệu tập tin, và nó không chờ đợi để trở lại cho đến khi những thay đổi đang đỏ mặt từ bộ nhớ cache đĩa phần cứng cơ bản và thể chất ghi vào đĩa.

Sau khi gọi "FlushFileBuffers (...)" thì dữ liệu của bạn sẽ được ghi trên thực tế vào đĩa.

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