在 C#中如果我有4-5 GB
数据现在采用bytes
格式,那么我将其转换为string
那么会产生什么影响这对于内存以及如何在为大字符串使用变量时更好地进行内存管理?
代码
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();
}
答案 0 :(得分:2)
.NET字符串存储为unicode,这意味着每个字符有两个字节。当您使用UTF8时,转换为字符串时,内存使用量会翻倍。
将文本转换为string
后,除非您尝试修改,否则不会再发生任何事情。 string
个对象是不可变的,这意味着每次使用Remove()
之类的方法修改它时,都会创建该字符串的新副本。
您可以在此处阅读更多内容:How are strings passed in .NET?
但是,字节数组总是通过引用传递,每次更改都会影响保存它的所有变量。因此,更改不会影响性能/内存消耗。
您可以使用byte[]
从字符串中获取var buffer = yourEncoding.GetBytes(yourString);
。可以使用静态变量访问常用编码:var buffer= Encoding.UTF8.GetBytes(yourString)
;