2011-01-19 25 views
9

Tôi có nhiều cấu trúc dữ liệu phong phú (chủ yếu là cây) mà tôi muốn tồn tại trên đĩa, nghĩa là tôi không chỉ muốn ghi chúng vào đĩa mà tôi muốn đảm bảo rằng dữ liệu đã được ghi đầy đủ và sẽ tồn tại -xuống.Làm thế nào để bạn lưu dữ liệu vào đĩa từ .NET?

Những người khác dường như thiết kế các cách mã hóa cấu trúc dữ liệu phong phú trong bảng cơ sở dữ liệu dạng phẳng dưới dạng bảng tra cứu từ nút cha sang con. Điều này tạo điều kiện cho chạy các truy vấn SQL chống lại các dữ liệu nhưng tôi không cần cho rằng: Tôi chỉ muốn lưu và tải cây của tôi.

Giải pháp rõ ràng là lưu trữ mọi thứ dưới dạng blob trong cơ sở dữ liệu: một mục nhập duy nhất có thể chứa chuỗi dài. Đó có phải là lạm dụng cơ sở dữ liệu hoặc thực tiễn được khuyến nghị không? Một giải pháp khác có thể là sử dụng một cơ sở dữ liệu XML? Có bất kỳ lựa chọn thay thế cho cơ sở dữ liệu mà tôi nên xem xét?

Cuối cùng, tôi đang làm điều này từ F # do đó, một giải pháp chìa khóa trao tay cho sự bền bỉ dữ liệu từ NET sẽ là lý tưởng ...

EDIT: Xin lưu ý rằng định dạng (ví dụ serialization) là không thích hợp như tôi có thể trivially chuyển đổi giữa các định dạng với F #. Đây là về việc thừa nhận rằng một ghi đã được hoàn thành tất cả các con đường xuống cửa hàng không dễ bay hơi (tức là đĩa đĩa) và không có phần nào của dữ liệu văn bản vẫn được giữ trong kho lưu trữ dễ bay hơi (ví dụ: bộ đệm RAM) để Tôi có thể tiếp tục an toàn trong kiến ​​thức đó (ví dụ: bằng cách xóa phiên bản cũ của dữ liệu khỏi đĩa).

+1

Re "giải pháp chìa khóa trao tay" - một số (không phải tất cả) cấu trúc F # có thể nằm ngoài cửa sổ * điển hình mong đợi bởi nhiều lớp kiên trì - sẽ sử dụng một lớp lớp DTO (ngay trước khi serialization) được chấp nhận nếu nó đơn giản hóa mọi thứ? Ngoài ra - Tôi nghi ngờ bạn có thể muốn xem xét các phần * serialization * và * ACID * một cách riêng biệt. –

+1

Nếu (xem nhận xét của bạn về Reed) khía cạnh tuần tự hóa không phải là vấn đề, thì có lẽ là bất kỳ cơ sở dữ liệu ACID * tài liệu nào *. –

+0

@Marc: "Cơ sở dữ liệu tài liệu ACID". Tuyệt vời, cảm ơn! –

Trả lời

9

Một số hàm tạo cho lớp FileStream của .NET lấy tham số kiểu FileOptions. Một trong các giá trị cho FileOptions là WriteThrough, trong đó "Chỉ ra rằng hệ thống sẽ ghi thông qua bất kỳ bộ nhớ đệm trung gian nào và chuyển trực tiếp vào đĩa".

Điều này phải đảm bảo rằng vào thời điểm hoạt động ghi của bạn (đối với tệp mới) trả về, dữ liệu được cam kết vào đĩa và bạn có thể xóa tệp cũ một cách an toàn.

+0

Hoàn hảo, cảm ơn! –

+2

Cảm ơn câu trả lời. Tôi đã không bao giờ nhận thức được sự tồn tại của các tập tin đó: WriteThrough, Asynchronous, RandomAccess, DeleteOnClose, SequentialScan và Encrypted. Nhìn vào mỗi người trong số họ có thể xứng đáng một bài đăng blog tốt. – Cygwin98

7

Điều này có thể thực hiện qua Serialization.

Khuôn khổ .NET bao gồm nhiều tùy chọn tích hợp để tuần tự hóa dữ liệu của bạn vào đĩa, bao gồm sử dụng định dạng nhị phân hoặc dựa trên XML. Chi tiết How-To articles được cung cấp trong Tài liệu MSDN.

+0

XMLSerializer sẽ không hoạt động với nhiều loại F #, đáng chú ý là các bản ghi và các công đoàn phân biệt đối xử, vì chúng không có các hàm tạo mẫu không có tham số mặc định. Điều này là không may, như các công đoàn phân biệt đối xử cung cấp một cách tuyệt vời của mô hình cây. Phân loại nhị phân là cách tiếp cận trực tiếp nhất – pblasucci

+0

@pblasucci: Có thể cần serialization nhị phân (hoặc serializer tùy chỉnh) nếu bạn đang sử dụng F # –

+0

@Reed: Câu trả lời này có liên quan đến câu hỏi của tôi về việc bảo đảm sự kiên trì như thế nào? –

0

Thử sử dụng XMLSerializer (System.Xml.Serialization).

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx

Nó có thể tự động kiên trì cấu trúc dữ liệu phức tạp dựa trên tài sản của họ, và bạn có thể sử dụng các thuộc tính để kiểm soát đầu ra, nếu bạn muốn:

http://msdn.microsoft.com/en-us/library/83y7df3e.aspx

+0

XMLSerializer sẽ không hoạt động với một số kiểu F #, đáng chú ý là các bản ghi và các công đoàn phân biệt đối xử, vì chúng không có các hàm tạo cá thể không tham số mặc định. Điều này là không may, như các công đoàn phân biệt đối xử cung cấp một cách tuyệt vời của mô hình cây. Phân loại nhị phân là cách tiếp cận trực tiếp nhất. – pblasucci

+0

@C. Lawrence Wenham: Câu trả lời này về định dạng liên quan đến câu hỏi của tôi về sự bền vững được bảo đảm đối với đĩa như thế nào? Cả serializer XML lẫn bất kỳ serializer nào khác cũng không bảo đảm như vậy, AFAIK. –

+0

Không có gì đảm bảo ghi vào đĩa, bạn sẽ cần phải kiểm tra sau đó rằng không có ngoại lệ, rằng tệp tồn tại và không phải là 0 byte. Bạn có thể thực hiện System.Transactions.IEnlistmentNotification trong một lớp tùy chỉnh sẽ tranh thủ viết của bạn trong một giao dịch phân phối, mặc dù, cung cấp cho bạn một sự truy đòi để khôi phục các hoạt động khác nếu viết không thành công –

3

Để làm điều này, bạn sẽ yêu cầu tài nguyên sẽ cho phép bạn tham gia vào một Transaction (thường xuyên hơn không, bạn sẽ sử dụng một số TransactionScope.

Hầu hết các cơ sở dữ liệu sẽ tham gia vào Transaction nếu có. Các hoạt động trên đĩa cũng có thể được quản lý bởi Transaction, nhưng bạn sẽ phải thực hiện một số specific work in order to utilize it in .NET.

Ngoài ra, lưu ý rằng tính năng này chỉ khả dụng trên Windows Vista trở lên.

Nếu bạn đi theo tuyến đường cơ sở dữ liệu, bạn có thể lưu trữ nội dung được sắp xếp theo hàng loạt các cây của bạn trong một blob (hoặc văn bản, tùy thuộc vào cơ chế tuần tự hóa).

Lưu ý, bạn cũng có thể sử dụng chức năng FILESTREAM trong SQL Server (2008 trở lên, tôi tin) để lưu trữ các tập tin của bạn trên hệ thống tập tin đạt được những lợi ích của các giao dịch trong SQL Server.

1

Tôi chưa từng sử dụng db4o từ F # trước đây, nhưng tất cả là về sự kiên trì đối tượng CLR đối tượng vào đĩa theo cách giao dịch. Nếu nó hoạt động với hồ sơ và các công đoàn kỳ thị, nó có thể phù hợp với bạn.

Chỉnh sửa: Tôi vừa thử nghiệm db4o 8.0 (phiên bản .NET 4) và có vẻ như xử lý cả hai loại bản ghi và phân cấp công đoàn phân biệt đối xử một cách hoàn hảo.

0

Hơi OT vì OP không muốn XML, nhưng thấy những người khác đã đề cập đến định dạng XML ... Nếu bạn muốn bền vững về văn bản, SoapFormatter xử lý các trường hợp (chu trình/đồ thị đối tượng) mà trình định dạng XML mặc định không - XML ​​của nó không thể đọc được như XMLFormatter, nhưng nó dễ đọc hơn nhị phân :)

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