【问题标题】:Pivot Excel With NReco, System Out of Memory Exception使用 NReco 透视 Excel,系统内存不足异常
【发布时间】:2016-10-14 14:24:25
【问题描述】:

我在使用 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);
            }

        }

创建范围数据透视表时出错

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

LazyTotal 模式为真

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

数据集有 200k 行。我认为这并不过分。我在 Windows 10 上有 8 GB 内存。 NReco 是免费版本。 有什么解决办法吗?

【问题讨论】:

  • 首先确保您的 .net 程序作为 x64 应用程序执行并且可以使用所有可用内存。然后,尝试减少为 PivotData 类配置的维数。 ExcelPivotTableWriter 使用 EPPlus 库导出到 Excel 数据透视表,根据数据集大小,它确实会消耗大量 RAM。
  • 我的应用程序作为 AnyCpu 运行

标签: c# asp.net pivot-table nreco


【解决方案1】:

8G 的物理内存可能不够,具体取决于 200K 行中的每一行有多大以及系统上运行的其他应用程序的内存消耗。

在运行此程序之前,请启动 Windows 任务管理器并单击“性能”选项卡。

注意可用和空闲内存值。然后运行你的程序并观察内存是如何消耗的。如果您的程序确实消耗了所有可用内存,那么您的选择是......

  1. 通过删除其他消耗内存的应用程序来释放更多内存。
  2. 为您的系统添加更多物理内存。
  3. 修改程序以提高内存效率。 (这包括消除内存泄漏)
  4. 前三个选项的某种组合。

【讨论】:

    【解决方案2】:

    您应该能够非常轻松地分割 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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-15
      • 2015-06-18
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多