【问题标题】:C# How can I clear the memory usage?C#如何清除内存使用情况?
【发布时间】:2017-03-27 10:59:37
【问题描述】:

此代码从 datagridview 导出 csv 文件。当导出的数据超过 1k 列和 10k 行时,偶尔会出现内存使用问题。
即使在代码中使用了 dispose() 和 flush() 之后,任务管理器的内存使用量也会增加。
我真正想要的是在 CSV 文件中添加一行并刷新内存。每次添加一行并刷新内存。
我怎么解决这个问题? 我已经用过 GC,结果没有变化。

private void export_csv_file()
    {
        SaveFileDialog dialog = new SaveFileDialog();
        dialog.Filter = "csv file (*.csv)|*.csv";
        dialog.FileName = DateTime.Now.ToString("yyyy-MM-dd_HHmmss") + "_R";

        String csvFile;
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            csvFile = dialog.FileName;
            StreamWriter sw_column = new StreamWriter(File.Open(csvFile, FileMode.Create), Encoding.Default);
            // write columns to csv file
            //m_gridView has a datatable
            foreach (DataGridViewColumn col in m_gridView.Columns)
            {
                sw_column.Write(col.Name + ",");
            }
            sw_column.Write("\r\n");
            sw_column.Dispose();
            sw_column.Close();

            foreach (DataGridViewRow row in m_gridView.Rows)
            {
                StreamWriter sw_row = new StreamWriter(File.Open(csvFile, FileMode.Append), Encoding.Default);

                foreach (DataGridViewCell cell in row.Cells)
                {
                    sw_row.Write(cell.Value + ",");
                }

                sw_row.Write("\r\n");
                sw_row.Dispose();
                sw_row.Close();
            }

            Thread.Sleep(500);
            this.Activate();
        }
        dialog.Dispose();
    }

【问题讨论】:

  • 你能看看这个链接,不是来自网格,但它的工作几乎相同。在不到 2 分钟的时间内导出了 50 万行。 codeproject.com/questions/454679/… 另外,我个人的经验表明,使用 StringBuilder 而不是 StreamnWriter 会有所帮助。应用大小检查并继续转储到文件中。
  • 很难看出到底是什么问题。方法完成后问题会消失吗?几点: - 无需为每行创建一个新的 StreamWriter。一个应该足够 - 任务管理器中的内存消耗不是一个好的指标。 Windows 只会在可用内存低(
  • 尝试使用 using 关键字定义流写入器,以便它自行处理。你可以在这里找到一些示例:dotnetperls.com/streamwriter
  • 问题是您想将所有结果存储在gridview中,然后保存到文件中。您应该从数据库(sqlreader)流式传输数据并按行保存。
  • 你能展示一下你是如何填充网格的吗?

标签: c# csv memory-management datagridview


【解决方案1】:

尝试使用这种格式重构您的代码,尽管正如@Jeroen van Langen 指出的那样,问题可能在于您使用数据源的方式

更新:既然您指出您首先将数据加载到 DataTable...

DataTable dt = new DataTable(); //Your datasource
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "csv file (*.csv)|*.csv";
sfd.FileName = DateTime.Now.ToString("yyyy-MM-dd_HHmmss") + "_R";

if (sfd.ShowDialog() == DialogResult.OK)
{
    using (StreamWriter sw = new StreamWriter(sfd.FileName))
    {
        //Add Column Headers
        sw.Write(string.Join(",", dt.Columns.Cast<DataColumn>().Select(c => c.ColumnName)));
        sw.Write(",\r\n");

        //Add Rows
        foreach (var row in dt.AsEnumerable().Select(r => r.ItemArray.Cast<string>()))
        {
            sw.Write(string.Join(",", row));
            sw.Write(",\r\n");
        }
    }
}

【讨论】:

  • 感谢您的评论。我试过你的建议和 sw.BaseStream.Close();和 sw.BaseStream.Dispose();但没有任何改变。
  • 还有我使用数据源和制作datagridview的方式会增加内存使用量,但导出过程也会增加内存使用量。
  • @장헌수 我更新了代码以直接从数据表中写入数据
  • 谢谢!我会试试这个,然后告诉你结果。
  • 你是对的。我无法看到内存使用量的增加。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 2011-02-19
  • 2012-04-28
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
相关资源
最近更新 更多