【发布时间】: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