2012-03-14 7 views
8

Like GuyFawkes, me gustaría utilizar MemoryStream para almacenar una gran cantidad de datos, pero sigo encontrando las excepciones de 'falta de memoria'.
La respuesta de TomTom es lo que me gustaría hacer: utilizar una implementación que no requiera un bloque contiguo, pero me pregunto si ya hay una implementación gratuita disponible, para que me permita escribir una.¿Hay una implementación de código abierto de MemoryStream que no usa memoria contigua?

¿Alguien sabe de una buena y gratuita reimplantación de MemoryStream que puede funcionar con grandes transmisiones?

EDIT:

solución El archivo proyectado en memoria es muy interesante y que será recordar que para otros proyectos, sin embargo, como dice Henk, se aleja demasiado de la abstracción que es el objetivo de MemoryStream. Específicamente, el requisito de una capacidad conocida.
Los datos que la reposición deberá manejar serán, en algunos casos, muy grandes, pero en otros relativamente pequeños (y no se sabe cuál será hasta que sea demasiado tarde;)); Además, muchas instancias de la clase existirán al mismo tiempo. En última instancia, el trabajo requerido para utilizar MemoryMappedFiles (para determinar un tamaño apropiado para cada uno) sería equivalente al de implementar la solución de TomTom.

+4

un problema similar en StringBuilder se fijó en .NET 4 mediante la alteración de la aplicación a utilizar cuerdas. Buscar en Google "cuerda de memoria" solo produce éxitos de programadores que están al final de uno. Un sistema operativo de 64 bits es la solución de cien dólares. –

+0

OK, he tomado la falta de (barra Eric y dtb que eran interesantes pero no exactamente lo que necesitaba) respuestas como un 'no' y así lo he implementado yo mismo. No es particularmente complicado, pero lo subiré si alguien puede sugerir el mejor lugar. – sebf

+0

@HansPassant, las cuerdas son una lectura interesante, gracias (¡incluso si googlear "memorystream rope" no es exactamente inspirador!) Para mi proyecto, aunque solo necesitaba flujos del orden de cientos de megabytes, bastaba con una simple lista en mi implementación. – sebf

Respuesta

0

No es exactamente una reimplementación de MemoryStream, pero considere si puede usar un Memory Mapped File para su requerimiento.

Los archivos de memoria mapeados pueden resolver muchas de las clases de problemas que los búferes de memoria grandes pueden resolver, son muy eficientes y son compatibles directamente con .NET.

+0

Pero no siempre es bueno para imitar una transmisión. –

+0

Los archivos AFAIK mapeados en memoria deben tener un tamaño fijo. – Qwertie

+0

¿Estás seguro? Estoy bastante seguro de que los archivos mapeados en memoria requieren una porción contigua de espacio de direcciones virtuales en su proceso. No ayudan a resolver este problema. –

1

Usted creará un MemoryMappedFile sin un archivo, es decir, uno que viva en la memoria del sistema. La opción DelayAllocatePages retrasa las asignaciones hasta que realmente se necesita la memoria. Sin embargo, debe especificar una capacidad máxima por adelantado. Use CreateViewStream Method para crear una secuencia.

+0

Gracias a ti y a Eric; Traté de implementar la solución MemoryMappedFile, pero no es muy adecuada para este caso (agregué detalles adicionales a la pregunta para explicar). – sebf

+0

¿Esto no requiere exactamente la misma cantidad de espacio de direcciones virtuales contiguas dentro de su proceso, y por lo tanto no resuelve el problema? –

Cuestiones relacionadas