2009-06-12 18 views
8

Bir MemoryStream kullanırken, kendimi genellikle (bu şekilde çoğaltılıyor) verileri geçici bir bayt dizisine kopyaladığımı buluyorum.MemoryStream vs bir dizi bayt

Sanırım biraz kaynak israfı israfı, çünkü MemoryStream, temeldeki bayt dizisine doğrudan erişmenize izin vermez.

Bu durumda, bir MemoryStream'in gerçek avantajı nedir? Bellek eşlemeli bir dosya gibi davranan bir yer okudum. Veri, yalnızca erişimde diskten getirilir, daha az bellek tüketir.

Bu doğru mu? Ben öyle düşünmüyorum. Belki bir FileStream için durum böyle?

Artığınız için teşekkür ederiz.

+2

Hangi dil ve kütüphane bu kullanıyor? – thecoop

+0

C# - .net çerçevesi. –

cevap

4

Benim için bir bellek akışının birincil avantajı, dinamik olarak büyüyüp, bunu yapmak için optimize edilmiş olmasıdır. kopyalamak ve bellek kopyalamak zorunda bir acıdır, ancak birincil kullanım sürecinin sonunda teslim edilecek bir arabellek oluşturmak ise, bu kusur bir şekilde amortize edilir.

FileStream'in aksine, MemoryStreams çok daha hızlıdır. Bunlar, FileStreams'den daha sınırlıdır, çünkü genellikle RAM'den çok daha fazla disk alanı vardır. Yani hıza veya alana ihtiyacınız olup olmadığına karar vermelisiniz.

+0

Her iki durumda da (MemoryStream veya FileStream), Okuma ve Yazma yöntemleri ofset ve sayım için bir tamsayı alır. Bu yüzden aynı boyuta gidebileceklerini düşünüyorum. –

+0

Teorik olarak, ancak MemoryStream'in bellekte saklandığını unutmayın, bu nedenle RAM dolduğunda, sayfa başlar ve bu, uygulamanın yavaşlamasına neden olur ve bir süre sonra sistem yavaşlar (RAM ve sayfa dolu olduğu için). –

+0

Evet, fark ettiğim bir komik şey, bir akımın Length özelliğinin uzun (8 bayt) olmasıdır. Okuma ve Yazma yöntemleriyle büyük bir dosyaya bile başvuramazsınız. Yerel win32 API'siyle bir ilgisi olduğundan eminim. –

3

Sen getBuffer işlevini kullanarak temel alınan bayt tampon alabilirsiniz (ama doğrudan tampon manipüle edebilmek istiyorsanız yararlıdır sağlanan bir bayt dizisinden MemoryStream yarattı yalnızca)

MemoryStream kullanmanın tek avantajı, akışlara dayalı bir API kullanıyorsanız, dinamik olarak büyümek için bayt arabelleğine ihtiyacınız varsa ..

+1

"Yalnızca sağladığınız bayt dizisinden ..." doğru değil. [Dokümanlar] 'ı denetleyin (http://msdn.microsoft.com/en-us/library/system.io.memorystream.getbuffer.aspx): 'Bu akışın oluşturulduğu bayt dizisi veya eğer varsa Geçerli örneğin yapımı sırasında MemoryStream yapıcısına bir bayt dizisi sağlanmadı. ”Yapım aşamasında bir dizi sağladığınızda ve GetBuffer'ın bunu döndürmesini istiyorsanız, 'publiclyVisible' bayrağıyla kurucunun aşırı yüklenmesini kullanmanız gerekir. ve bunu "true" olarak ayarlayın, aksi takdirde bir "UnauthorizedAccessException" alırsınız. –

İlgili konular