2012-08-05 57 views
0

在应用程序日志文件,这是我们正在OutOfMemory例外

2012-07-19 15错误:08:46995 [17] WARN System.Web.UI.Page [(空)] - 日志记录: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; 

    } 
    // 
+0

请发布相关代码。 – twoflower 2012-08-05 21:20:34

+0

如果你不给我们一些额外的信息,如PC类型(嵌入式,服务器,个人)和一些代码抛出异常 – hellow 2012-08-05 21:20:43

+0

我们不能建议任何东西看到代码日志会帮助... – Pacane 2012-08-05 21:20:49

回答

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

===>

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

尽量不要产生整个csv文件在一个StringBuilder中,改为写入流。

0

您将多少数据添加到CSV文件? StringStringBuilder类限于2^31-1(2,147,483,647)个字符,这可能会受到计算机内存的进一步限制。

要将大量数据写入文件或网络客户端,请将其写入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); 
    } 
} 
+0

谢谢我要试一试 – SPL 2012-08-06 01:27:52

+0

对不起另外一个问题我应该怎样从调用函数 – SPL 2012-08-06 01:35:56

+0

传递流出流变量这取决于你在做什么。什么是你的'Session [“exportsCsv”]'相关的?我猜这是关于ASP页面的,我没有什么经验。 – 2012-08-06 02:34:58