La copie à partir d'un flux à un autre?
Pour le travail, le cahier des charges sur mon projet est d'utiliser .Net 2.0, donc je ne la pratique CopyTo
fonction amené plus tard.
J'ai besoin de copier le flux de réponse à partir d'un HttpWebResponse
à un autre flux (le plus souvent une MemoryStream
, mais il pourrait être une sous-classe de Stream
). Mon normal tactique a été quelque chose le long des lignes de:
BufferedStream bufferedresponse = new BufferedStream(HttpResponse.GetResponseStream());
int count = 0;
byte[] buffer = new byte[1024];
do {
count = bufferedresponse.Read(buffer, 0, buffer.Length);
target.Write(buffer, 0, count);
} while (count > 0);
bufferedresponse.Close();
Existe-il des moyens plus efficaces pour ce faire? La taille de la mémoire tampon a vraiment de l'importance? Quel est le meilleur moyen pour copier à partir d'un flux à un autre .Net 2.0?
P. S. C'est pour télécharger un grand,+ de 200 MO SIG tif images. Bien sûr, la fiabilité est primordiale.
Avant que j'en arrive à ma question fermée, je tiens à dire que la mienne est livré avec la .Net 2.0 restriction. J'espère que c'est suffisant pour le maintenir ouvert, je ne veux pas que mes questions fermées 🙁
La question que j'ai lié à la réponse à l'aide de votre méthode ainsi que la plus récente
CopyTo
méthode. Il vaut la peine de mentionner que vous obtiendrez de meilleures performances (si cela correspond à votre cas d'utilisation) à attendre pour l'ensemble du flux à venir et ensuite de copier le flux de plus en plus gros morceaux. Mais ce n'est pas toujours idéal.OriginalL'auteur Corey Ogburn | 2011-06-02
Vous devez vous connecter pour publier un commentaire.
C'est une fonction très pratique. Et oui, la taille de la mémoire tampon questions. En augmentant il peut vous donner de meilleures performances sur les gros fichiers.
OriginalL'auteur Magnus
La taille de la mémoire tampon. Si vous êtes à la copie d'un mégaoctet de données, un octet à la fois, par exemple, vous allez faire un 2^20 itérations dans la boucle. Si vous êtes à la copie 1 kilo-octet à la fois, vous n'aurez qu'à faire 2^10 itérations dans la boucle. Il y a une surcharge importante dans les appels à
Read
etWrite
lorsque vous faites de millions d'entre eux.Pour la lecture
FileStream
, j'utilise généralement un tampon entre 64 ko et 256K. Rien de moins que 32K montre une diminution marquée de la performance, de même que quelque chose au-dessus de 256K. La différence entre l'utilisation de 64 ko de mémoire tampon et une de 256 ko de mémoire tampon n'est pas la peine de la mémoire supplémentaire. Soyez conscient, cependant, que ces nombres sont sur mon système et en travers de mon réseau. Vos numéros varier selon la configuration matérielle et du système d'exploitation.Pour des flux de réseau, vous devez sélectionner une taille de mémoire tampon qui va suivre le flux de données entrantes. Je suggère au moins 4 kilo-octets, ce qui va vous donner un peu de tampon si l'écriture des stands pour une raison quelconque.
OriginalL'auteur Jim Mischel
Vous pouvez vous débarrasser de la
BufferedStream
, il est seulement utile si vous êtes à la lecture des petits morceaux de la rivière. Juste obtenir le flux de réponse dans une variable et utiliser:Un tampon est trop petit réduit le rendement. Vous pouvez utiliser un tampon plus grand, de sorte qu'au moins les données à partir d'un ensemble de paquets IP correspond. J'ai regardé un peu autour de lui, et 4096 octets doit être suffisant pour que. Vous pouvez vraiment utiliser n'importe quelle taille jusqu'à 85 ko, après c'est allouée dans le gros tas d'objets, que vous devriez éviter de faire quand il n'y a aucune raison pour cela.
Autre que cela, il est à peu près aussi efficace qu'il obtient.
OriginalL'auteur Guffa
Je pense à deux manières.
Vérifier si le Flux de données.MemberWiseClone() correspond à votre besoin. Il vous permet de vous d'une copie de votre objet.
Vérifier si cela fonctionne, si les deux extrémités sont du type de Flux.
BufferedStream bs = new BufferedStream((Stream)memoryStreamObject);
OriginalL'auteur SaravananArumugam