[英]sb = new StringBuilder(1024*1024*1024) > 'System.OutOfMemoryException' was thrown
我需要在循環中添加很多字符串,這將創建一個很長的字符串。
1GB應該足夠長來存儲字符串,因此我這樣做:
var sb = new StringBuilder(1024 * 1024 * 1024);
但收到此錯誤
'System.OutOfMemoryException' was thrown
有什么建議來附加長字符串嗎?
我正在為MySQL數據庫編寫備份工具。 該工具將從數據庫導出數據並寫入文本文件。 該數據包含BLOB和TEXT數據類型。 因此,將期望很長的字符串。
這是代碼: 代碼已更新1
var conn = new MySqlConnection(Program.ConnectionString);
var cmd = new MySqlCommand();
cmd.Connection = conn;
conn.Open();
cmd.CommandText = selectSQL;
MySqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
var sb = new StringBuilder(1024 * 1024 * 1024);
for (int i = 0; i < rdr.FieldCount; i++)
{
if (sb.Length > 0)
sb.AppendFormat(separator);
if (rdr[i].GetType() == typeof(byte[]))
{
sb.AppendFormat(ConvertByteArrayToHexString((byte[])rdr[i]));
}
else
sb.AppendFormat(rdr[i] + "");
}
WriteToFile(sb.ToString());
}
conn.Close();
使用文件流寫入長文件。 無需一次將完整的字符串保留在內存中。
內存不足錯誤可能是由多種原因引起的,具體取決於Windows虛擬內存的方式以及.NET運行時的工作方式。
您是否真的需要一次將所有內容全部轉儲到StringBuilder中? 如果要寫入文件,則可以一次執行多個操作。
使用類似以下內容作為起點:int bufferSize = 65536;
using (StreamWriter sw = new StreamWriter("filename", true, System.Text.Encoding.UTF8, bufferSize))
{
while(!finished)
{
string data = "foo"; //get next data here...
sw.Write(data);
}
}
`
參考: 什么消耗更少的資源,並且File.AppendText或File.WriteAllText更快地存儲在StringBuilder中?
您並沒有要求一個StringBuilder具有足夠的容量來存儲1 GB-您已經要求一個StringBuilder具有足夠的容量來存儲1024 * 1024 * 1024個字符,這將(大約)需要2 GB的內存。 該長度小於最大字符串長度(2 ^ 31-1個字符),但大於32位進程中可用的堆空間。
您可能不需要具有這種能力的StringBuilder-其他答案對此進行了討論。 假設您需要一個巨大的字符串,那么您絕對不需要為該字符串預分配該大小。 只需創建一個StringBuilder,然后讓它自己增長 :
var sb = new StringBuilder();
或預先分配一些更合理的數據(如果您知道將擁有大量數據):
var sb = new StringBuilder(1024 * 1024);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.