2016-08-01 3 views
0

大規模なDataTableをExcelシート(.xls)形式にエクスポートしています。ここでは、DataTableを返すストアドプロシージャを呼び出します。ストアドプロシージャは、93の列を持つ750,000の行を返すために使用されました。大きなデータをxls形式にエクスポートする:システムがメモリ不足例外

バックエンドでは、ストアドプロシージャのパラメータを渡すと、プロセスが長いためプロセスを完了するのに8分かかります。

しかし、フロントエンドからプロシージャを呼び出すと、レコードをDataTableに割り当てているときに、 "System Out Of Memory"例外が発生します。

だから私はGoogleにそれを知ったときに、サイズがサーバーのRAMサイズを超えていることがわかったので、この例外がスローされます。 小さなDataTableをエクスポートすると正常に動作します。

これに代わる方法は何ですか?誰でも私を提案します。あなたはこの種の問題のためのDataTableを使用してはならない

  DataTable dt = BindDatatable(); 
      Response.ClearContent(); 
      Response.Buffer = true; 
      Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "MBQ_Auto.xls")); 
      Response.ContentType = "application/ms-excel"; 
      //Response.ContentType = "application/octet-stream"; 
      //Response.ContentType = "text/tab-separated-values"; 
      string str = string.Empty; 
      foreach (DataColumn dtcol in dt.Columns) 
      { 
       Response.Write(str + dtcol.ColumnName); 
       str = "\t"; 
      } 
      Response.Write("\n"); 
      int rowCount = 0; 
      foreach (DataRow dr in dt.Rows) 
      { 
       str = ""; 
       for (int j = 0; j < dt.Columns.Count; j++) 
       { 
        Response.Write(str + Convert.ToString(dr[j])); 
        str = "\t"; 
       } 
       Response.Write("\n"); 
       if (unchecked(++rowCount % 1024 == 0)) 
        Response.Flush(); 
      } 
      Response.End(); 
+0

サーバーメモリには大きすぎると、クライアントに何をするのでしょうか? (フィールドの1つにタブ文字が含まれているとどうなりますか?) – Richard

+1

xlsファイル形式では65,000を超える行がサポートされています。より多くの行を使用するには、xlsxを使用する必要があります。 – Linkan

+0

xlsを使用して2つ以上のlakhsレコードをエクスポートしています。 – thevan

答えて

1

:以下は私のコード、

C#があります。 DataTableは、データ全体をメモリに格納します。

データベースから行をフェッチするには、DataReaderを使用する必要があります。

関連する問題