2009-06-12 8 views
8

Lors de l'utilisation d'un MemoryStream, je me retrouve souvent à copier (donc à dupliquer) des données dans un tableau temporaire d'octets.MemoryStream vs un tableau d'octets

Je pense que c'est un peu un gaspillage de ressources, car MemoryStream ne vous permet pas d'accéder directement au tableau d'octets sous-jacent.

Dans cette situation, quel est le véritable avantage d'un MemoryStream? J'ai lu quelque part qu'il agit comme un fichier mappé en mémoire. Les données sont amenées du disque uniquement à l'accès, consommant moins de mémoire.

Est-ce vrai? Je ne pense pas. Peut-être que c'est le cas pour un FileStream?

Merci pour vos éclaircissements.

+2

Quelle langue et quelle bibliothèque utilisez-vous? – thecoop

+0

C# - .net cadre. –

Répondre

4

Pour moi, le principal avantage d'un flux de mémoire est qu'il se développe dynamiquement et qu'il est optimisé pour ce faire. Il est une douleur d'avoir à copier et dupliquer sur la mémoire, mais si vous utilisez principal est de construire un tampon à remettre pied à la fin du processus, ce défaut est amorti quelque peu.

Je devrais ajouter, contrairement à un FileStream, MemoryStreams sont beaucoup, beaucoup plus rapide. Ils sont plus limités en taille que FileStreams, car vous avez généralement beaucoup plus d'espace disque que la RAM. Vous devez donc décider si vous avez besoin de vitesse ou d'espace.

+0

Eh bien, dans les deux cas (MemoryStream ou FileStream), les méthodes de lecture et d'écriture prennent un nombre entier pour offset et count. Donc je pense qu'ils peuvent aller jusqu'à la même taille. –

+0

Ils peuvent théoriquement, mais rappelez-vous que MemoryStream est stocké dans la mémoire, de sorte que lorsque la RAM est pleine, il commence à la page, et cela entraînera un ralentissement de l'application, et après un certain temps, les ralentissements du système (en raison de la RAM et la page étant pleine). –

+0

Oui, une chose amusante que j'ai remarquée est que la propriété Length d'un flux est longue (8 octets). Vous ne pouvez même pas référencer un fichier aussi gros avec les méthodes Read et Write. Je suis assez sûr qu'il a quelque chose à voir avec l'API win32 natif. Vous –

3

Vous pouvez obtenir le tampon d'octets sous-jacente en utilisant la fonction getBuffer (mais seulement si vous avez créé le MemoryStream à partir d'un tableau d'octets que vous avez fourni, ce qui est utile si vous voulez être en mesure de manipuler le tampon directement)

Le seul avantage d'utiliser un MemoryStream est si vous utilisez une API basée sur des flux, ou si vous avez besoin du tampon d'octets pour pouvoir développer dynamiquement.

+1

"seulement si ... à partir d'un tableau d'octets que vous avez fourni" n'est pas vrai. Vérifiez [les docs] (http://msdn.microsoft.com/en-us/library/system.io.memorystream.getbuffer.aspx): Renvoie 'Le tableau d'octets à partir duquel ce flux a été créé, ou le tableau sous-jacent si un tableau d'octets n'a pas été fourni au constructeur MemoryStream pendant la construction de l'instance actuelle. En fait, si vous fournissez un tableau en construction et que vous voulez que GetBuffer le renvoie, vous devez utiliser la surcharge du constructeur avec le drapeau 'publicVisible' et mettez cela à 'true', sinon vous obtiendrez' UnauthorizedAccessException'. –

Questions connexes