2016-10-14 14 views
0

のシステムアウト私はrangePivotTableピボットExcelとNReco、メモリ例外

var rangePivotTable = wsData.Cells["A1"].LoadFromDataTable(tbl, false); 

作成中NReco ExcelPivotTableWriterでピボットテーブルを作成

public void Write(PivotTable pvtTbl) 
     { 
      var tbl = getPivotDataAsTable(pvtTbl.PivotData); 
      var rangePivotTable = wsData.Cells["A1"].LoadFromDataTable(tbl, false); 

      var pivotTable = ws.PivotTables.Add(
        ws.Cells[1, 1], 
        rangePivotTable, "pvtTable"); 

      foreach (var rowDim in pvtTbl.Rows) 
       pivotTable.RowFields.Add(pivotTable.Fields[rowDim]); 
      foreach (var colDim in pvtTbl.Columns) 
       pivotTable.ColumnFields.Add(pivotTable.Fields[colDim]); 

      pivotTable.ColumGrandTotals = false; 
      pivotTable.DataOnRows = false; 
      pivotTable.ColumGrandTotals = false;    
      pivotTable.RowGrandTotals = false; 


      if (pvtTbl.PivotData.AggregatorFactory is CompositeAggregatorFactory) 
      {     
       var aggrFactories = ((CompositeAggregatorFactory)pvtTbl.PivotData.AggregatorFactory).Factories; 
       for (int i = 0; i < aggrFactories.Length; i++) 
       { 
        var dt = pivotTable.DataFields.Add(pivotTable.Fields[String.Format("value_{0}", i)]); 
        dt.Function = SuggestFunction(aggrFactories[i]); 

        string columnName = ""; 
        if (dt.Function == OfficeOpenXml.Table.PivotTable.DataFieldFunctions.Sum) 
          columnName = ((NReco.PivotData.SumAggregatorFactory)aggrFactories[i]).Field; 
        else if(dt.Function == OfficeOpenXml.Table.PivotTable.DataFieldFunctions.Average) 
         columnName = ((NReco.PivotData.AverageAggregatorFactory)aggrFactories[i]).Field; 

        if (columnNames.ContainsKey(columnName)) 
         dt.Name = columnNames[columnName].ToString(); 
        else 
         dt.Name = aggrFactories[i].ToString();        
       } 
      } 
      else 
      { 
       pivotTable.DataFields.Add(pivotTable.Fields["value"]).Function = SuggestFunction(pvtTbl.PivotData.AggregatorFactory); 
      } 

     } 

エラーがoccuresながら、メモリ例外のシステムのアウトを取得メートルレイジー合計モードがtrueです。

var ordersPvtData = new PivotData(dimentionsArray, composite, true); 

データセットには200k行があります。あまりにも私は思っていません。私は窓10に8GBのRAMを持っています。 NRecoは無料版です。 どのような解決策ですか?

+0

まず、.netプログラムがx64アプリケーションとして実行され、使用可能なすべてのメモリを使用できることを確認してください。次に、Pivo​​tDataクラス用に構成されたディメンションの数を減らしてください。 ExcelPivotTableWriterは、ExcelピボットテーブルにエクスポートするためにEPPlusライブラリを使用し、実際にはデータセットのサイズに応じて多くのRAMを消費する可能性があります。 –

+0

私のアプリケーションはAnyCpuとして動作します –

答えて

0

8Gは、各200K行の大きさとシステムで実行されている他のアプリケーションのメモリ消費量に応じて物理メモリが不足することがあります。

このプログラムを実行する前に、Windowsのタスクマネージャを起動し、[パフォーマンス]タブをクリックしてください。

enter image description here

は、利用可能な空きメモリの値に注意してください。次に、プログラムを実行し、メモリがどのように消費されているかを観察します。あなたのプログラムが使用可能なメモリをすべて消費する場合、オプションは次のとおりです。

  1. メモリを消費する他のアプリケーションを削除して、メモリを解放します。
  2. システムに物理メモリを追加します。
  3. メモリをより効率的に使用するようにプログラムを変更します。 (これにはメモリリークの除去が含まれます)
  4. 上記の3つのオプションのいくつかの組み合わせ。
0

200k行をかなり簡単にスライスすることができます。このように試してみてください。 。 。

Workbook workbook = new Workbook(); 
workbook.LoadFromFile(@"C:\your_path_here\SampleFile.xlsx"); 
Worksheet sheet = workbook.Worksheets[0]; 
sheet.Name = "Data Source"; 
Worksheet sheet2 = workbook.CreateEmptySheet(); 
sheet2.Name = "Pivot Table"; 
CellRange dataRange = sheet.Range["A1:G200000"]; 
PivotCache cache = workbook.PivotCaches.Add(dataRange); 
PivotTable pt = sheet2.PivotTables.Add("Pivot Table", sheet.Range["A1"], cache); 
var r1 = pt.PivotFields["Vendor No"]; 
r1.Axis = AxisTypes.Row; 
pt.Options.RowHeaderCaption = "Vendor No"; 

var r2 = pt.PivotFields["Description"]; 
r2.Axis = AxisTypes.Row; 
pt.DataFields.Add(pt.PivotFields["OnHand"], "SUM of OnHand", SubtotalTypes.Sum); 
pt.DataFields.Add(pt.PivotFields["OnOrder"], "SUM of OnOrder", SubtotalTypes.Sum); 
pt.DataFields.Add(pt.PivotFields["ListPrice"], "Average of ListPrice", SubtotalTypes.Average); 

pt.BuiltInStyle = PivotBuiltInStyles.PivotStyleMedium12; 
workbook.SaveToFile("PivotTable.xlsx", ExcelVersion.Version2010); 
System.Diagnostics.Process.Start("PivotTable.xlsx");