2017-03-03 2 views
0

J'ai un 1GB dans le serveur A, je dois utiliser la méthode Read() pour l'obtenir en local. Il est divisé en paquets (paquet 16517). Chaque paquet contient un en-tête de 65536 octets.Meilleur moyen d'écrire un octet [] dans un fichier binaire

Actuellement, j'utilise BinaryWriter pour écrire chaque paquet dans un fichier directement. Mais cela m'a pris plus de 5 minutes (323642 ms).

Je tente de joindre certains paquets en byte[] de 10 Mo, mais cela ne réduit pas le temps (317397 ms).

Quelle est la meilleure façon d'écrire byte[] dans un fichier binaire?

Mise à jour

const ulong Memory_10MB = 10485760; // 10MB 
do { 
    byte[] packetData = Read(&totalSize, /*Other parameters*/ ,&hasFollowing); 
    if (package == null) { 
     // Process error 
     return; 
    } 
    dataSize += (ulong)packetData.Length; 
    if (dataSize >= Memory_10MB) 
    { 
     if (binaryWriter == null) 
     { 
      path = Path.GetTempFileName(); 
      fileStream = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.Read); 
      binaryWriter = new BinaryWriter(fileStream); 
      if (responseData.Length > 5) 
      { 
       binaryWriter.Write(responseData.Skip(5).ToArray()); 
      } 
     }   
     binaryWriter.Write(packetData); 
    } 
    else 
    { 
     responseData = Utilities.ConcatArrays(responseData, packetData); 
    } 

} while (dataSize < totalSize); 
// Process after got data 
+0

Si vous copiez simplement le fichier en utilisant Windows Explorer, combien de temps cela prend-il? Quoi que ce soit je ne m'attendrais pas à ce que tu puisses l'améliorer beaucoup. –

+2

Comment écrivez-vous les données? S'il vous plaît poster votre code. –

+0

Tout d'abord, mon fichier de sortie se trouve sous le dossier 'Temp'. Je le copie dans un autre lecteur. Cela prend environ 3 secondes – GSP

Répondre

1

Quel chemin est le meilleur d'écrire octet [] dans le fichier binaire?

Directement à un FileStream. Le BinaryWriter ajoute juste un peu de frais généraux.

La taille du paquet devrait (pourrait) être optimisée pour votre matériel, mais en général, la valeur par défaut devrait être plus que suffisante.

+0

Si je joins certains paquets dans byte [] alors écris-le dans un fichier. Ce qui est mieux? Et combien de taille de byte [] est préférable d'écrire dans le fichier? – GSP

+1

Je ne connais pas les chiffres exacts, mais ça commence à 8k et 16k donc vos blocs de 64k devraient être corrects. Vous avez déjà essayé cela (10M) et vous n'avez vu aucune amélioration, alors ne vous embêtez pas. –