簡體   English   中英

sb =新的StringBuilder(1024 * 1024 * 1024)>引發了'System.OutOfMemoryException'

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM