มีการใช้งาน MemoryStream แบบโอเพ่นซอร์สที่ไม่ได้ใช้หน่วยความจำที่อยู่ติดกันหรือไม่

เช่นเดียวกับ GuyFawkes ฉันต้องการใช้ MemoryStream เพื่อจัดเก็บข้อมูลจำนวนมาก แต่มักพบข้อยกเว้น 'หน่วยความจำไม่เพียงพอ'
คำตอบของ TomTom คือสิ่งที่ฉันต้องการทำ - ใช้การใช้งานที่ไม่จำเป็นต้องมีบล็อกที่ต่อเนื่องกัน - แต่ฉันสงสัยว่ามีการใช้งานฟรีอยู่แล้วหรือไม่ เพื่อช่วยฉันเขียนเองเหรอ?

มีใครทราบเกี่ยวกับการนำ MemoryStream ไปใช้ใหม่ที่ดีและฟรี ซึ่งสามารถทำงานกับสตรีมขนาดใหญ่ได้หรือไม่

แก้ไข:

โซลูชัน MemoryMappedFile น่าสนใจมากและฉันจะจำไว้สำหรับโปรเจ็กต์อื่นๆ อย่างไรก็ตาม ดังที่ Henk กล่าวว่า มันห่างไกลจากนามธรรมที่ MemoryStream มุ่งหมายไว้มากเกินไป โดยเฉพาะข้อกำหนดของความจุที่ทราบ
ข้อมูลที่อุปกรณ์ทดแทนจะต้องจัดการในบางกรณีจะมีขนาดใหญ่มาก แต่ในบางกรณีก็ค่อนข้างเล็ก (และเราไม่รู้ว่าจะเป็นเช่นไรจนกว่าจะสายเกินไป ;) ); ยิ่งไปกว่านั้น หลายๆ อินสแตนซ์ของคลาสจะมีอยู่พร้อมๆ กัน ท้ายที่สุดแล้ว งานที่ต้องใช้ MemoryMappedFiles (เพื่อกำหนดขนาดที่เหมาะสมสำหรับแต่ละรายการ) จะเทียบเท่ากับการนำโซลูชันของ TomTom ไปใช้


person sebf    schedule 14.03.2012    source แหล่งที่มา
comment
ปัญหาที่คล้ายกันใน StringBuilder ได้รับการแก้ไขใน .NET 4 โดยการเปลี่ยนการใช้งานไปใช้เชือก Googling memorystream Rope สร้างความนิยมของโปรแกรมเมอร์ที่อยู่ตอนท้ายของหนึ่ง ระบบปฏิบัติการ 64 บิตคือโซลูชันที่คุ้มค่าเงินร้อยดอลลาร์   -  person Hans Passant    schedule 14.03.2012
comment
ตกลง ฉันขาดคำตอบ (ของบาร์เอริคและ dtb ซึ่งน่าสนใจแต่ไม่ใช่สิ่งที่ฉันต้องการ) ว่าเป็นคำตอบว่า 'ไม่' และฉันก็เลยนำไปปฏิบัติด้วยตัวเอง มันไม่ซับซ้อนมากนัก แต่ฉันจะอัปโหลดถ้ามีคนแนะนำสถานที่ที่ดีที่สุดได้   -  person sebf    schedule 15.03.2012
comment
@HansPassant เชือกเป็นการอ่านที่น่าสนใจ ขอบคุณ (แม้ว่า Googling memorystream Rope ของ Googling จะไม่สร้างแรงบันดาลใจอย่างแน่นอน!) สำหรับโครงการของฉันแม้ว่าฉันต้องการเพียงสตรีมตามลำดับหลายร้อยเมกะไบต์เท่านั้น ดังนั้นรายการง่ายๆในการใช้งานของฉันก็เพียงพอแล้ว   -  person sebf    schedule 15.03.2012


คำตอบ (3)


นี่คือการดำเนินการของฉันในกรณีที่ใครก็ตามต้องการมัน ฉันจะเปิดคำถามนี้ทิ้งไว้สักหน่อยเผื่อมีคนตอบกลับด้วยสิ่งที่ดีกว่านี้

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

person sebf    schedule 18.03.2012

คุณสร้าง MemoryMappedFile โดยไม่มีไฟล์ นั่นคืออันที่อยู่ในหน่วยความจำระบบ ตัวเลือก DelayAllocatePages ชะลอการจัดสรรจนกว่าหน่วยความจำ จำเป็นจริงๆ คุณต้องระบุความจุสูงสุดล่วงหน้า ใช้CreateViewStream Method เพื่อสร้างสตรีม

person dtb    schedule 14.03.2012
comment
ขอขอบคุณคุณและเอริค; ฉันพยายามใช้โซลูชัน MemoryMappedFile แต่ก็ไม่เหมาะกับกรณีนี้มากนัก (ฉันได้เพิ่มรายละเอียดเพิ่มเติมในคำถามเพื่ออธิบาย) - person sebf; 14.03.2012
comment
สิ่งนี้ยังคงต้องการพื้นที่ที่อยู่เสมือนที่อยู่ติดกันภายในกระบวนการของคุณเท่ากันทุกประการ จึงไม่ช่วยแก้ปัญหาใช่หรือไม่ - person Roman Starkov; 18.03.2012

ไม่ใช่การนำ MemoryStream ไปใช้ใหม่อย่างแน่นอน แต่พิจารณาว่าคุณสามารถใช้ ไฟล์ที่แมปหน่วยความจำได้หรือไม่ ตามความต้องการของคุณ

ไฟล์ที่แมปหน่วยความจำสามารถแก้ปัญหาหลายคลาสที่บัฟเฟอร์หน่วยความจำขนาดใหญ่สามารถแก้ไขได้ มีประสิทธิภาพมาก และได้รับการสนับสนุนโดยตรงจาก .NET

person Eric J.    schedule 14.03.2012
comment
ไฟล์ที่แมปหน่วยความจำ AFAIK จะต้องมีขนาดคงที่ - person Qwertie; 14.03.2012
comment
คุณแน่ใจไหม? ฉันค่อนข้างมั่นใจว่าไฟล์ที่แมปหน่วยความจำต้องใช้พื้นที่ที่อยู่เสมือนที่ต่อเนื่องกันในกระบวนการของคุณ พวกเขาไม่ได้ช่วยแก้ปัญหานี้ - person Roman Starkov; 18.03.2012