【问题标题】:'System.OutOfMemoryException' on copying csv file to Data table将 csv 文件复制到数据表时出现“System.OutOfMemoryException”
【发布时间】:2017-07-04 10:05:25
【问题描述】:

我用 C# 开发了一个代码,可以将数据从 csv 文件复制到数据表中。 csv 文件包含 500 万行,我逐行读取行以防止内存问题。我想知道为什么我仍然得到 OutOfMemory 异常。我添加了断点以确保将正确的字符串复制到我的变量中并且它们正常工作。有什么想法吗?

int first_row_flag = 0;   //first row is column name and we dont need to import them
string temp;                
foreach (var row in File.ReadLines(path3))
{
    if (!string.IsNullOrEmpty(row))
    {
        int i = 0;
        if (first_row_flag != 0)
        {
            dt.Rows.Add();
            foreach (string cell in row.Split(','))
            {

                if (i < 9)
                {
                    temp = cell.Replace("\n", "");
                    temp = temp.Replace("\r", "");
                    dt.Rows[dt.Rows.Count - 1][i] = temp;
                    i++;
                }
            }
        }
        else
        {
            first_row_flag++;    //get rid of first row
        }
    }
}

每行的列数是 9。这就是为什么我使用 i 来确保我不会在第 10 列中读取意外数据。

这是堆栈跟踪:

【问题讨论】:

  • 您正在一次将所有这些数据加载到 DataTable 中?好像会占用很多内存....
  • 您仍在添加和添加(我猜)数据表。
  • 如果您仍然将所有行都保存在内存中,这里的逐行帮助究竟如何?
  • 为什么这最终不会使您的内存不足?如果你只“投入”而不“拿出”,你最终会用完。
  • 我认为 OP 关心的是为什么创建 500 万个空行(因为只有第一个被填充)导致 OOM。很可能是由于使用 32 位进程来运行代码(请参阅stackoverflow.com/questions/14186256/…)...(忽略创建数百万个空行的实际价值)...

标签: c# asp.net csv


【解决方案1】:

500 万行,可能需要处理太多数据。 (取决于列数和值)。检查文件大小,然后将其与可用的内存进行比较,以获得粗略的想法。关键是,有了这么多数据,在大多数情况下,您将在使用其他技术时出现内存不足异常。

您应该重新考虑DataTable 的用法,如果您保存记录以便以后可以在数据库中插入,那么小批量处理您的数据。

如果您决定批量处理数据,那么您甚至可以考虑完全不使用DataTable,而是使用List&lt;T&gt;

另外,看看其他技术来读取 CSV 文件。 Reading CSV files using C#

【讨论】:

  • 旁注:您确实知道“列数和值” - 除了最多 9 行之外的所有行都是空的... :)
猜你喜欢
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 1970-01-01
相关资源
最近更新 更多