2011-01-14 21 views
5

Ben 4.Yerel Önbellek Kütüphane C# (kalıcı ve şifreli)

Benim gereksinimleri şifreli dosyaya kaydeder kalıcı anahtar-değer mağazası için olduğunu C# ile yazılmış bir Windows masaüstü uygulaması önbelleğe alma eklemek arıyorum. Potansiyel olarak — yavaş olan ve önemli miktarda veri, yani 50+ MB önbelleğe alabilen bir sunucuya uzaktan çağrıları önbelleğe almaya çalışıyorum. Bir tür LRU son kullanma tarihi ile bir maksimum dosya boyutu değeri ayarlayabilmek istiyorum.

Bir sözlüğü serileştirmeyi düşünmüştüm, ancak bunun başlangıçta biraz yavaşlaması ve bellek ayak izinin çok büyük olması muhtemeldir.

Şifrelenmiş bir SQLCE 4 veritabanının en iyi çözüm olabileceğini düşünüyorum ancak bu sadece tek bir karma tablo istediğimde ağır görünüyor. Ayrıca, son kullanma tarihinin önbellekleme türü özelliklerini de sunmaz.

Herkes, göz önünde bulundurmaya değecek başka bir şey önerebilir veya serileştirme/desantizasyon işlemlerini optimize etme konusunda bazı önerilerde bulunabilir.

+0

Sadece Dictionary'i serileştirmeyi denediniz mi? Benim deneyimime göre, dosya serileştirme normalde çok hızlıdır. –

+0

Yapmadım - 50MB + bir sözlüğün bellek yükü, – Chris

+0

numaralı perfüzyondan önce endişemdir Checkout: ['PersistentDictionary'] (http://izlooite.blogspot.com/2011/04/persistent-dictionary.html) sınıfı –

cevap

0

SolFS kitaplığımıza bakabilirsiniz. Bu, verilerinizi dosyalara yerleştirdiğiniz ve anahtarı dosya adı olarak kullandığınız sanal bir dosya sistemidir. Kodunuzda "Süresi dolmuş" dosya temizleme işlemi yapılmalıdır. SolFS, yerleşik şifreleme (ve kendi şifreleme mekanizmalarınızı ekleyebilirsiniz) sağlar ve büyük dosyaları tutabilir (dosya başına birkaç GB). Ayrıca, dosya boyutuna önem veriyorsanız, SolFS ayrıca yerleşik sıkıştırmaya sahiptir.

0

Serileştirmeyi en iyi duruma getirmek için, ISerializable arabirimini uygulayarak ve XML veya JSon'a veya başka bir şeye dönüştürerek kendi serileştirme yönteminizi yapabilirsiniz.

1

Seri hale getirmeyi kesinlikle düşünmelisiniz. Ben birkaç ay önce (ve SQLCE denemeyi de dahil olmak üzere) bu yuvarlak ve yuvarlak gitti ve serileştirilmiş nesnelerin hızına yakın bir şey yoktu (benim durumumda özel nesneler kullanıyordum) - SQLCE serileştirilmiş olarak yüklemek için 2-3 kez aldı nesneler.

Bellek izi çok büyükse, neyi sürdürdüğünüzü nasıl tasarladığınızı yeniden gözden geçirmelisiniz.

1

SQLCE 4 üzerinden SQLite kullanılmasını öneririm. SQLite motoru, bellek kısıtlamalı ortamlarda çalışmak üzere açıkça tasarlanmıştır. Bellek vs hız kararı geliştiriciye bırakılmıştır.

open source ADO.NET library, Microsoft veritabanı araçlarından (DbProviderFactory, Entity Framework, Server Explorer, vb.) Tam olarak yararlanmanızı sağlar. Aynı zamanda şifrelemeyi de destekler.

LRU uygulaması aşağıdaki gibi bir şema verilen oldukça basit olacaktır:

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

protobuf-net ve File encryption in .NET birleşimi yararlı olabilir.

seri numarasını seri hale getirmek için protobuf-net'i numaralı telefondan kullanabilirsiniz. (Bir 'Kişiler' nesnesinin bir ikili dosyaya devam etmesi örneği için başlangıç ​​kılavuzuna bakın). protobuf ayrıca bir bayt [] döndüren yöntemler de vardır, bu sayede bayt akışını tekrar okumayı önlemek için bunu kriptoya aktarabilirsiniz.

İlgili konular