0

NReco ExcelPivotTableWriterでピボット テーブルを作成しているときに、System Out of Memory 例外が発生します

 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);
            }

        }

rangePivotTable の作成中にエラーが発生しました

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

LazyTotal モードは真です

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

データセットには 20 万行あります。多すぎるとは思いません。Windows 10 で 8 GB の RAM を使用しています。NReco は無料バージョンです。解決策はありますか?

4

2 に答える 2

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");
于 2016-12-28T18:44:35.843 に答える
0

200K 行のそれぞれの大きさと、システムで実行されている他のアプリケーションのメモリ消費量によっては、8G は十分な物理メモリではない場合があります。

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

ここに画像の説明を入力

Available および Free Memory の値に注意してください。次に、プログラムを実行し、メモリがどのように消費されるかを観察します。プログラムが利用可能なメモリをすべて消費する場合、選択肢は...

  1. メモリを消費する他のアプリケーションを削除して、より多くのメモリを解放します。
  2. システムに物理メモリを追加します。
  3. プログラムを変更して、メモリ効率を高めます。(これにはメモリリークの除去が含まれます)
  4. 前の 3 つのオプションの組み合わせ。
于 2016-10-14T14:48:38.297 に答える