2012-03-14 20 views
8

Like GuyFawkes, Büyük miktarda veri depolamak için MemoryStream'i kullanmak istiyorum, ancak 'bellekte' özel durumlarıyla karşılaşmaya devam ediyorum.
TomTom'un cevabı, yapmak istediğim şeydir - bitişik bir blok gerektirmeyen bir uygulamayı kullanmak - ama zaten ücretsiz bir uygulama olup olmadığını merak etmekteyim.Bitişik bellek kullanmayan açık kaynaklı bir MemoryStream uygulaması var mı?

Büyük akışlarla çalışabilecek MemoryStream uygulamasının iyi ve ücretsiz bir şekilde yeniden uygulanmasını bilen var mı?

DÜZENLEME:

MemoryMappedFile çözümü çok ilginç ve ben Henk diyor ancak olarak, bu MemoryStreambaytlık hedefliyor soyutlama çok uzak cızırtı, diğer projeler için hatırlayarak olacaktır. Özellikle, bilinen bir kapasitenin gerekliliği.
Yerine koyma işleminin yapacağı veriler, bazı durumlarda çok büyük olacaktır, ancak diğerleri nispeten küçüktür (ve çok geç olana kadar ne olacağını bilmiyoruz;)); dahası, sınıfın birçok örneği aynı zamanda var olacaktır. Sonuçta, MemoryMappedFiles kullanmak için gerekli olan (her biri için uygun bir boyut belirlemek için), TomTom'un çözümününkiyle eşdeğer olacaktır.

+4

StringBuilder de benzer bir sorun halatlarını kullanmak uygulanmasını değiştirerek .NET 4'te giderilmiştir. Googling "memorystream ip" sadece bir ucunda olan programcıların hitlerini üretir. 64 bit işletim sistemi, yüz dolarlık bir çözümdür. –

+0

Tamam, ben (bar ve Eric benim ihtiyaç duyduğum değil ama ilginç) bir 'hayır' olarak cevaplar bar ve ben kendim uyguladık. Onun özellikle karmaşık değil ama birisi en iyi yeri önerebilirse onu yüklerim? – sebf

+0

@HansPassant, halatlar ilginç bir okuma, Teşekkürler (Googling "memorystream ip" tam olarak ilham verici değildir!) Benim projemde sadece yüzlerce megabaytlık sırayla akışa ihtiyacım olsa da, benim uygulamada basit bir liste yeterli. – sebf

cevap

0

Tam olarak MemoryStream uygulamasının yeniden uygulanması değil, gereksiniminiz için bir Memory Mapped File kullanıp kullanamayacağınızı düşünün.

Bellek Eşlemeli Dosyalar, geniş bellek arabelleklerinin çözebileceği, çok verimli olduğu ve doğrudan .NET tarafından desteklenen birçok sorun sınıfını çözebilir.

+0

Ama bir akışı taklit ederken her zaman iyi değil. –

+0

AFAIK bellek eşlemeli dosyaların sabit bir boyuta sahip olması gerekir. – Qwertie

+0

Emin misin? Bellek eşlemeli dosyaların işleminizde bitişik bir sanal adres alanı yığını gerektirdiğinden eminim. Bu sorunu çözmeye yardımcı olmazlar. –

1

MemoryMappedFile bir dosya olmadan, yani sistem belleğinde yaşayan bir tane oluşturursunuz. DelayAllocatePages seçeneği, bellek gerçekten gerekli olana kadar ayırmaları geciktirir. Yine de maksimum bir kapasite belirtmeniz gerekiyor. Akış oluşturmak için CreateViewStream Method'u kullanın.

+0

Size ve Eric'e teşekkür ederiz; MemoryMappedFile çözümünü uygulamaya çalıştım, ancak bu durum için oldukça uygun değil (açıklamak için sorulan soruya ekstra detay ekledim). – sebf

+0

Bu, işleminizde hala tam olarak aynı miktarda bitişik sanal adres alanı gerektirmiyor, dolayısıyla sorunu çözmüyor mu? –

İlgili konular