【问题标题】:Process Memory (MB) keeps going up进程内存 (MB) 不断增加
【发布时间】:2017-11-10 08:59:13
【问题描述】:

我有一个运行以下代码的代码:

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        string path = txtPath.Text;
        var workbook = new XLWorkbook(path);
        var worksheet = workbook.Worksheet(txtWorksheet.Text);
        var cells = worksheet.Range(txtMinRange.Text+":"+txtMaxRange.Text).Cells();

            foreach (var c in cells)
            {
                if (c.Value == "")
                {
                    c.Value = "-";
                }
                else
                {
                    c.Value = c.Value;
                }

            }

        workbook.SaveAs("RowCells.xlsx");
        workbook.Dispose();
    }

它的作用是将excel文件中给定范围的所有空白单元格更改为破折号“-”并将其保存到另一个名为RowCells的文件中。

但是查看内存使用情况,它会不断变高,直到应用程序进入中断模式。

如何降低内存使用率?

【问题讨论】:

  • worksheet 也实现了IDisposable 所以也许你也应该处理它。
  • 你100%确定内存使用和上面的代码有关吗?

标签: c# visual-studio closedxml


【解决方案1】:

代码看起来应该可以工作,但您的输入电子表格可能非常大。 无论如何,我不知道 ClosedXML 在内部是如何工作的,但它可能会保留一个已更改单元格的列表。由于您正在更改范围中的每个单元格,这可能会变得非常大,您应该只更改需要更改的单元格。做这样的事情:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    string path = txtPath.Text;
    var workbook = new XLWorkbook(path);
    using (var worksheet = workbook.Worksheet(txtWorksheet.Text))
    {
        var cells = worksheet.Range(txtMinRange.Text+":"+txtMaxRange.Text).Cells();
        foreach (var c in cells)
        {
            if (c.Value == "")
            {
                c.Value = "-";
            }
        }
    }
    workbook.SaveAs("RowCells.xlsx");
    workbook.Dispose();
}

【讨论】:

  • 谢谢!是的,我相信这是因为文件太大。我正在尝试使用 A-KC 的列处理 17,000 行。我尝试使用您的代码,然后在 2 小时后,它显示 OutOfMemoryException。
猜你喜欢
  • 2017-04-02
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 2015-05-25
  • 2014-11-13
  • 2014-06-14
相关资源
最近更新 更多