/ / Comment fonctionne la gestion de la mémoire entre octets et chaîne? - c #, gestion de la mémoire

Comment fonctionne la gestion de la mémoire entre octets et chaîne? - c #, gestion de la mémoire

Dans C # Si j'ai 4-5 GB des données qui est maintenant sous forme de bytes alors je le convertis en string alors quel sera l'impact de ceci sur la mémoire et comment faire une meilleure gestion de la mémoire en utilisant variable pour les grandes chaînes?

Code

 public byte[] ExtractMessage(int start, int end)
{
if (end <= start)
return null;

byte[] message = new byte[end - start];
int remaining = Size - end;

Array.Copy(Frame, start, message, 0, message.Length);

// Shift any remaining bytes to front of the buffer
if (remaining > 0)
Array.Copy(Frame, end, Frame, 0, remaining);

Size = remaining;
ScanPosition = 0;

return message;
}



byte[] rawMessage = Buffer.ExtractMessage(messageStart, messageEnd);

// Once bytes are received, I want to create an xml file which will be used for further more work

string msg = Encoding.UTF8.GetString(rawMessage);

CreateXMLFile(msg);

public void CreateXMLFile(string msg)
{
string fileName = "msg.xml";
if (File.Exists(fileName))
{
File.Delete(fileName);
}
using (File.Create(fileName)) { };

TextWriter tw = new StreamWriter(fileName, true);
tw.Write(msg);
tw.Close();
}

Réponses:

2 pour la réponse № 1

Les chaînes .NET sont stockées au format Unicode, ce qui signifie deux octets par caractère. Lorsque vous utilisez UTF8, vous doublez l’utilisation de la mémoire lors de la conversion en chaîne.

Une fois que vous avez converti le texte en un string rien de plus ne se produira à moins d’essayer de le modifier. string les objets sont immuables, ce qui signifie qu'une nouvelle copie de la chaîne sera créée chaque fois que vous la modifierez à l'aide de l'une des méthodes telles que Remove().

Vous pouvez lire plus ici: Comment les chaînes sont-elles passées dans .NET?

Toutefois, un tableau d'octets est toujours passé par référence et chaque modification affectera toutes les variables qui le contiennent. Ainsi, les changements ne nuiront pas aux performances / à la consommation de mémoire.

Vous pouvez obtenir un byte[] à partir d'une chaîne en utilisant var buffer = yourEncoding.GetBytes(yourString);. Les codages courants sont accessibles à l’aide de variables statiques: var buffer= Encoding.UTF8.GetBytes(yourString);