0

アプリケーションログファイルで、これは私たちが得ているエラーです

2012-07-19 15:08:46,995 [17] 警告 System.Web.UI.Page [(null)] - Logging:System.OutOfMemoryException: 'System.OutOfMemoryException' 型の例外がスローされました。System.String.GetStringForStringBuilder (文字列値、Int32 startIndex、Int32 長さ、Int32 容量) で System.Text.StringBuilder.GetNewString (文字列 currentString、Int32 requiredLength) で System.Text.StringBuilder.Append (文字列値)

誰でもこの問題を回避する方法を提案できますか? データをExcelシートに書き込むために文字列ビルダーを使用しました

ここにコードがあります

public void ToCSV(DataTable dt)
{
    StringBuilder sb = null;
    try
    {

        sb = new StringBuilder(50*1024);
        foreach (DataColumn col in dt.Columns)
        {
            sb.Append(col.ColumnName + ",");
        }
        sb.Remove(sb.Length - 1, 1);
        sb.Append(Environment.NewLine);
        foreach (DataRow row in dt.Rows)
        {
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                sb.Append("\"" + row[i].ToString() + "\"" + ",");
            }
            sb.Append(Environment.NewLine);
        }
        Session["exportsCsv"] = sb;
        sb = null;


    }
    catch (Exception ex)
    {
        log4net.Config.XmlConfigurator.Configure();
        log.Warn("Logging:" + ex);

    }
    finally {
        sb = null;

    }
    //
4

2 に答える 2

0
sb.Append("\"" + row[i].ToString() + "\"" + ","); 

===>

sb.Append('\"').Append(row[i].ToString()).Append("\",");

1 つの StringBuilder で csv ファイル全体を生成するのではなく、ストリームに書き込みます。

于 2012-08-05T22:22:52.503 に答える
0

CSV ファイルに追加するデータの量は? およびクラスは 2^31-1 (2,147,483,647) 文字に制限されてStringおりStringBuilder、コンピューターのメモリによってさらに制限される可能性があります。

大量のデータをファイルまたはネットワーク クライアントに書き込むには、Stream代わりに に書き込みます。

public void ToCSV(DataTable dt, Stream outStream)
{ 
    StreamWriter writer = new StreamWriter(outStream); 
    try 
    { 
        bool first = true;
        foreach (DataColumn col in dt.Columns) 
        {
            if (first)
                first = false;
            else
                writer.Write(",");

            writer.Write(col.ColumnName); 
        } 
        writer.WriteLine(); 
        foreach (DataRow row in dt.Rows) 
        { 
            for (int i = 0; i < dt.Columns.Count; i++) 
            { 
                writer.Write("\"" + row[i].ToString() + "\"" + ","); 
            } 
            writer.WriteLine(); 
        } 
        // Not sure what to replace this with:
        //Session["exportsCsv"] = sb; 
    } 
    catch (Exception ex) 
    { 
        log4net.Config.XmlConfigurator.Configure(); 
        log.Warn("Logging:" + ex); 
    } 
}
于 2012-08-06T01:19:52.457 に答える