【发布时间】: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/…)...(忽略创建数百万个空行的实际价值)...