Apakah ada implementasi MemoryStream open source yang tidak menggunakan memori yang berdekatan?

Seperti GuyFawkes, saya ingin menggunakan MemoryStream untuk menyimpan data dalam jumlah besar , tetapi terus menemui pengecualian 'kehabisan memori'.
Jawaban TomTom adalah yang ingin saya lakukan - gunakan implementasi yang tidak memerlukan blok yang berdekatan - tetapi saya ingin tahu apakah sudah ada implementasi gratis yang tersedia, untuk menyelamatkanku menulisnya sendiri?

Adakah yang mengetahui implementasi ulang MemoryStream yang bagus dan gratis yang dapat bekerja dengan aliran besar?

Sunting:

Solusi MemoryMappedFile sangat menarik dan saya akan mengingatnya untuk proyek lain, namun seperti yang dikatakan Henk, solusi ini menyimpang terlalu jauh dari abstraksi yang diinginkan MemoryStream. Secara khusus, persyaratan kapasitas yang diketahui.
Data yang harus ditangani oleh pengganti dalam beberapa kasus akan sangat besar, namun dalam kasus lain relatif kecil (dan tidak, kami tidak tahu yang mana sampai terlambat;) ); selanjutnya, banyak instance kelas akan ada pada saat yang bersamaan. Pada akhirnya, pekerjaan yang diperlukan untuk menggunakan MemoryMappedFiles (untuk menentukan ukuran yang sesuai untuk masing-masing file) akan setara dengan implementasi solusi TomTom.


person sebf    schedule 14.03.2012    source sumber
comment
Masalah serupa di StringBuilder diperbaiki di .NET 4 dengan mengubah implementasi menggunakan tali. Tali aliran memori Googling hanya menghasilkan hits programmer yang ada di akhir. Sistem operasi 64-bit adalah solusi terbaik.   -  person Hans Passant    schedule 14.03.2012
comment
Oke, saya menganggap kekurangan jawaban (bar Eric dan dtb yang menarik tetapi tidak sesuai dengan yang saya butuhkan) sebagai 'tidak' dan telah menerapkannya sendiri. Ini tidak terlalu rumit tapi saya akan mengunggahnya jika ada yang bisa menyarankan tempat terbaik?   -  person sebf    schedule 15.03.2012
comment
@HansPassant, tali adalah bacaan yang menarik, Terima kasih (Meskipun tali aliran memori Googling tidak terlalu menginspirasi!) Untuk proyek saya, saya hanya membutuhkan aliran dalam urutan ratusan megabita, jadi daftar sederhana dalam implementasi saya sudah cukup.   -  person sebf    schedule 15.03.2012


Jawaban (3)


Inilah implementasi saya jika ada yang membutuhkannya; Saya akan membiarkan pertanyaan ini terbuka sebentar kalau-kalau ada yang masih menjawab dengan lebih baik.

http://www.codeproject.com/Articles/348590/A-replacement-for-MemoryStream

person sebf    schedule 18.03.2012

Anda akan membuat MemoryMappedFile tanpa file, yaitu yang tinggal di memori sistem. Opsi DelayAllocationPages menunda alokasi hingga memori habis sebenarnya dibutuhkan. Anda perlu menentukan kapasitas maksimum terlebih dahulu. Gunakan Metode CreateViewStream untuk membuat streaming.

person dtb    schedule 14.03.2012
comment
Terima kasih untuk Anda dan Eric; Saya mencoba menerapkan solusi MemoryMappedFile, tetapi tidak cukup cocok untuk kasus ini (saya telah menambahkan detail tambahan pada pertanyaan untuk dijelaskan). - person sebf; 14.03.2012
comment
Bukankah ini masih memerlukan jumlah ruang alamat virtual yang berdekatan dalam proses Anda, sehingga tidak menyelesaikan masalah? - person Roman Starkov; 18.03.2012

Bukan implementasi ulang MemoryStream, tetapi pertimbangkan apakah Anda dapat menggunakan File yang Dipetakan Memori untuk kebutuhan Anda.

File yang Dipetakan Memori dapat menyelesaikan banyak kelas masalah yang dapat diselesaikan oleh buffer memori besar, sangat efisien, dan didukung langsung oleh .NET.

person Eric J.    schedule 14.03.2012
comment
File yang dipetakan memori AFAIK harus memiliki ukuran tetap. - person Qwertie; 14.03.2012
comment
Apa kamu yakin? Saya cukup yakin bahwa file yang dipetakan memori memerlukan sejumlah ruang alamat virtual yang berdekatan dalam proses Anda. Mereka tidak membantu menyelesaikan masalah ini. - person Roman Starkov; 18.03.2012