将csv文件复制到Data表时出现'System.OutOfMemoryException'

时间:2017-02-15 16:14:12

标签: c# asp.net csv

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

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列中读取意外数据。

这是堆栈跟踪:

enter image description here

1 个答案:

答案 0 :(得分:2)

500万行,可能需要处理太多数据。 (它将取决于列数和值)。检查文件大小,然后将其与可用于大致想法的内存进行比较。关键是,在这么多数据的情况下,大部分时间都会出现内存异常以及其他技术。

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

如果您决定批量处理数据,那么您甚至可以考虑不使用DataTable,而是使用List<T>

另外,请查看其他读取CSV文件的技巧。 Reading CSV files using C#