2010-07-21 25 views
6

Tôi đang cố gắng triển khai cơ chế lưu trữ tệp chứa một số bản ghi có kích thước khác nhau trong một tệp với bảo đảm rằng tập hợp các bản ghi sẽ luôn có thể phục hồi thành trạng thái nhất quán, ngay cả khi hệ thống không thành công ở phần cứng cấp độ.Dữ liệu trong tệp ánh xạ bộ nhớ có được bảo đảm để tuôn ra tuần tự không?

Cho đến giờ, mọi chương trình tôi đã đưa ra các mưu đồ về ghi dữ liệu tuần tự. Một số mẩu dữ liệu sẽ được nối vào cuối mỗi bản ghi để xác nhận rằng quá trình ghi đã thành công. Tuy nhiên, nếu dữ liệu không nhất thiết được ghi vào đĩa liên tiếp khi được xóa thì có thể ghi dữ liệu xác nhận trước dữ liệu nội dung.

Có hai cách rõ ràng xung quanh này, nhưng cả hai đều không mong muốn:

  1. Xối ngay nội dung, sau đó viết thư xác nhận và tuôn nó. Thêm tuôn ra thêm có thể làm giảm hiệu suất.
  2. Bao gồm tổng kiểm tra trong xác nhận (sẽ yêu cầu đọc nội dung để xác nhận rằng nó hợp lệ).

Tôi đang sử dụng C# trên Windows (32 và 64-bit) và Net 4.0 của bộ nhớ ánh xạ tập tin thực hiện

+0

Ý tưởng thứ hai (xác minh dữ liệu , dấu thời gian, số thứ tự và kiểm tra) có vẻ hợp pháp. Tuy nhiên, nói chung, bạn nên xem xét các nhóm khả dụng cao, với các máy riêng biệt trên mạng. Tất cả các bản ghi hoặc ghi nhật ký cần phải được nhân rộng qua mạng đến hai hoặc nhiều máy. Bạn không thể trích xuất bất kỳ bảo đảm nào từ một máy tính, thời gian. – rwong

Trả lời

1

Đây là mức quá thấp và hệ điều hành cụ thể đối với C#. thử sử dụng API Windows từ C và đọc kỹ các đặc tả API.

0

Bạn đã thử sử dụng FileOptions.WriteThrough trên dòng phim cơ bản chưa? Điều đó có thể hữu ích vì nó vô hiệu hóa bộ đệm. Các ý tưởng khác là giữ một tập tin riêng biệt chứa các xác nhận như là bản bù cuối cùng, nếu nó không khớp với các tệp của bạn (do cúp điện chẳng hạn), bạn có thể đơn giản cắt bớt kích thước đó làm kích thước đó

+1

Đó là những ý tưởng tốt về phục hồi lỗi. Thật không may họ không áp dụng cho các tập tin ánh xạ bộ nhớ. Tệp MM luôn bị WriteThrough tắt vì chúng sử dụng trình quản lý trang cơ bản của OS để xử lý bộ đệm. Giữ một bản ghi xác nhận cũng là một ý tưởng hay nhưng nó có các vấn đề khác. Sau đó nó sẽ yêu cầu hai flushes cho mỗi hoạt động tập tin (một cho các tập tin MM, một cho đăng nhập). Thậm chí còn có nhiều vấn đề hơn, với các tệp MM bạn không biết khi nào việc hoàn thành tuôn ra. Tốt nhất bạn có thể hướng dẫn hệ điều hành khởi động, nhưng bạn không nhận được xác nhận sau khi hoàn thành. Điều đó làm cho một bản ghi xác định một không-đi –

+0

@Kennet Belenky: Điều về xả nước là lạ, so sánh với [Java] (http://docs.oracle.com/javase/1.4.2/docs/api/java/nio /MappedByteBuffer.html). Có lẽ bạn có thể sử dụng một FileOutputStream bình thường cho nhật ký (nhật ký là ngắn nên sẽ không có nhiều sự khác biệt về tốc độ)? IIUYC mất một hồ sơ chưa được xác nhận không phải là xấu, vì vậy bạn có thể xả nhật ký hiếm hơn. – maaartinus

+0

@maaartinus API của Java chắc chắn dễ dàng hơn để giải thích theo, nhưng nó cũng không hoàn hảo. Nó là tốt đẹp mà nó cung cấp đảm bảo rằng tuôn ra được hoàn thành khi trở về. Tuy nhiên, nó sẽ đẹp hơn nếu nó cung cấp cho bạn một thông báo không đồng bộ để bạn có thể đi về doanh nghiệp của bạn. Các 10ms tìm thời gian của một tuôn ra đĩa quay là một thời gian dài để ngồi nhàn rỗi. –

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