Существует ли реализация MemoryStream с открытым исходным кодом, которая не использует непрерывную память?

Как и ГайФокс, я хотел бы использовать MemoryStream для хранения большого объема данных. , но продолжайте сталкиваться с исключениями "недостаточно памяти".
Ответ TomTom - это то, что я хотел бы сделать - использовать реализацию, которая не требует непрерывного блока, - но мне интересно, есть ли уже бесплатная реализация, доступная, чтобы избавить меня от написания одного самому?

Кто-нибудь знает хорошую бесплатную повторную реализацию MemoryStream, которая может работать с большими потоками?

РЕДАКТИРОВАТЬ:

Решение MemoryMappedFile очень интересное, и я буду помнить его для других проектов, однако, как говорит Хенк, оно слишком далеко отходит от абстракции, к которой стремится MemoryStream. В частности, требование известной емкости.
Данные, которые будет обрабатывать замена, будут в некоторых случаях очень большими, но в других относительно небольшими (и нет, мы не знаем, какие они будут, пока не станет слишком поздно ;) ); кроме того, многие экземпляры класса будут существовать одновременно. В конечном итоге работа, необходимая для использования MemoryMappedFiles (для определения подходящего размера для каждого из них), будет эквивалентна работе по внедрению решения TomTom.


person sebf    schedule 14.03.2012    source источник
comment
Аналогичная проблема в StringBuilder была исправлена ​​в .NET 4 путем изменения реализации для использования веревок. Погугление веревки потока памяти просто выдает хиты программистов, которые находятся в конце одного. 64-битная операционная система — стодолларовое решение.   -  person Hans Passant    schedule 14.03.2012
comment
Хорошо, я воспринял отсутствие (за исключением Эрика и dtb, которые были интересны, но не совсем то, что мне было нужно) ответов как «нет» и поэтому реализовал это сам. Это не особенно сложно, но я загружу его, если кто-нибудь может предложить лучшее место?   -  person sebf    schedule 15.03.2012
comment
@HansPassant, веревки - интересное чтение, спасибо (даже если гуглить веревку потока памяти не совсем вдохновляет!) Для моего проекта мне нужны были только потоки порядка сотен мегабайт, поэтому простого списка в моей реализации было достаточно.   -  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 для создания потока.

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