8 votes

Existe-t-il une implémentation Open Source de MemoryStream qui n'utilise pas de mémoire contiguë ?

Comme GuyFawkes J'aimerais utiliser MemoryStream pour stocker une grande quantité de données, mais je rencontre sans cesse des exceptions de type "out of memory".
La réponse de TomTom correspond à ce que j'aimerais faire - utiliser une implémentation qui ne nécessite pas de bloc contigu - mais je me demande s'il existe déjà une implémentation gratuite disponible, pour m'éviter d'en écrire une moi-même ?

Quelqu'un connaît-il une bonne réimplémentation libre de MemoryStream qui puisse fonctionner avec des flux importants ?

EDIT :

La solution MemoryMappedFile est très intéressante et je m'en souviendrai pour d'autres projets, mais comme le dit Henk, elle s'éloigne trop de l'abstraction visée par MemoryStream. Plus précisément, l'exigence d'une capacité connue.
Les données que le remplaçant devra traiter seront dans certains cas très volumineuses, mais dans d'autres relativement petites (et non, nous ne savons pas lesquelles avant qu'il ne soit trop tard ;)) ; en outre, de nombreuses instances de la classe existeront en même temps. En fin de compte, le travail requis pour utiliser les MemoryMappedFiles (pour déterminer une taille appropriée pour chacun d'entre eux) serait équivalent à celui de la mise en œuvre de la solution de TomTom.

3voto

sebf Points 793

Voici ma mise en œuvre au cas où quelqu'un en aurait besoin ; je laisserai cette question ouverte pendant un certain temps au cas où quelqu'un répondrait avec quelque chose de mieux.

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

1voto

dtb Points 104373

Vous pouvez créer un Fichier à mémoire mappée sans fichier, c'est-à-dire un fichier qui vit dans la mémoire du système. Les Retarder l'allocation des pages retarde les allocations jusqu'à ce que la mémoire soit réellement nécessaire. Vous devez cependant spécifier une capacité maximale à l'avance. Utilisez l'option Méthode CreateViewStream pour créer un flux.

0voto

Eric J. Points 73338

Il ne s'agit pas exactement d'une réimplémentation de MemoryStream, mais réfléchissez à la possibilité d'utiliser un Fichier en mémoire pour répondre à vos besoins.

Les fichiers mappés en mémoire peuvent résoudre de nombreuses catégories de problèmes que les grandes mémoires tampons peuvent résoudre, ils sont très efficaces et sont pris en charge directement par .NET.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X