2011-01-14 29 views
5

Tôi đang tìm để thêm bộ nhớ đệm để một ứng dụng desktop của Windows được viết bằng C# 4.Local cache Thư viện C# (dai dẳng và được mã hóa)

Yêu cầu của tôi là dành cho một cửa hàng quan trọng có giá trị dai dẳng mà tiết kiệm cho một tập tin được mã hóa. Tôi đang cố gắng lưu lại các cuộc gọi từ xa đến máy chủ có khả năng chậm — và có thể lưu vào bộ nhớ cache một lượng dữ liệu đáng kể, tức là 50+ MB. Tôi muốn có thể đặt giá trị kích thước tệp tối đa với một số dạng LRU hết hạn.

Tôi đã nghĩ đến việc tạo chuỗi từ điển, nhưng điều này có thể hơi chậm để khởi tạo và sẽ có quá nhiều bộ nhớ.

Tôi đang nghĩ một cơ sở dữ liệu SQLCE 4 được mã hóa có thể là giải pháp tốt nhất, nhưng điều này có vẻ nặng khi tôi thực sự chỉ muốn có một bảng băm đơn. Nó cũng không cung cấp các tính năng loại bộ nhớ đệm của thời gian hết hạn vv ..

Bất kỳ ai cũng có thể đề xuất bất kỳ điều gì đáng xem xét, hoặc một số gợi ý xung quanh tối ưu hóa việc tuần tự hóa/deserialisation.

+0

Bạn đã thử nghiệm với việc chỉ cần serializing từ điển? Theo kinh nghiệm của tôi, tập tin deserialization thường rất nhanh. –

+0

Tôi chưa - phí trên bộ nhớ của từ điển 50MB + là mối quan tâm của tôi trước sự hoàn hảo – Chris

+0

Thanh toán: ['PersistentDictionary'] (http://izlooite.blogspot.com/2011/04/persistent-dictionary.html) class –

Trả lời

0

Bạn có thể xem thư viện SolFS của chúng tôi. Đây là một hệ thống tệp ảo, nơi bạn đặt dữ liệu của mình vào tệp và sử dụng khóa làm tên tệp. Tuy nhiên, việc dọn dẹp tệp "hết hạn" phải được thực hiện trong mã của bạn. SolFS cung cấp mã hóa tích hợp (và bạn có thể thêm các cơ chế mã hóa của riêng mình) và có khả năng giữ các tệp lớn (vài GB cho mỗi tệp là hoàn toàn tốt). Hơn nữa, SolFS cũng có sẵn tính năng nén nếu bạn quan tâm đến kích thước tệp.

0

Để tối ưu hóa tuần tự hóa, bạn có thể tạo phương thức tuần tự hóa của riêng mình bằng cách triển khai giao diện ISerializable và biến thành XML hoặc JSon hoặc bất kỳ thứ gì khác.

1

Bạn hoàn toàn nên xem xét việc tuần tự hóa. Tôi đã đi vòng quanh với điều này (bao gồm cả cố gắng SQLCE) một vài tháng trước và không có gì gần với tốc độ của các đối tượng được tuần tự hóa (trong trường hợp của tôi, tôi đã sử dụng các đối tượng tùy chỉnh) - SQLCE mất 2-3 lần để tải theo thứ tự các đối tượng.

Nếu dấu chân bộ nhớ quá lớn, bạn nên xem xét lại cách bạn đang thiết kế những gì bạn đang lưu giữ.

1

Tôi khuyên bạn nên sử dụng SQLite trên SQLCE 4. Công cụ SQLlite được thiết kế rõ ràng để hoạt động trong môi trường bị hạn chế về bộ nhớ. Quyết định về bộ nhớ và tốc độ được để lại cho nhà phát triển.

open source ADO.NET library cho phép bạn tận dụng tối đa các công cụ cơ sở dữ liệu của Microsoft (DbProviderFactory, Entity Framework, Server Explorer, v.v.). Nó cũng hỗ trợ mã hóa.

Việc thực hiện LRU sẽ là khá đơn giản được đưa ra một sơ đồ như sau:

CREATE TABLE "cache" ("key" varchar(64) NOT NULL PRIMARY KEY, "value" text NOT NULL, "last_access" datetime NOT NULL); 
CREATE INDEX "cache_lru" ON "cache" ("last_access"); 
0

Một sự kết hợp của protobuf-netFile encryption in .NET có thể hữu ích.

Bạn có thể sử dụng protobuf-net để serialize/deserialze một cách nhanh chóng. (Xem hướng dẫn bắt đầu cho một ví dụ về sự bền bỉ đối tượng 'Person' thành một tệp nhị phân). protobuf cũng có các phương thức trả về một byte [] để bạn có thể chuyển nó tới mật mã để tránh đọc luồng byte trở lại.

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