【发布时间】:2012-07-13 01:05:54
【问题描述】:
我知道以前有人问过这个问题,但我似乎无法用我读过的答案来解决这个问题。我有一个 CSV 文件 ~ 1.2GB,如果我像 32 位一样运行进程,我会得到 outOfMemoryException,如果我将它作为 64 位进程运行,它可以工作,但它仍然需要 3.4GB 的内存,我知道我在我的 customData 类中存储了很多数据,但仍然有 3.4gb 的内存?,我在读取文件时做错了吗? dict 是一本字典,其中我只有一个映射到要保存某些内容的属性,具体取决于它所在的列。我的阅读方式是否正确?
StreamReader reader = new StreamReader(File.OpenRead(path));
while(!reader.EndOfStream) {
String line = reader.ReadLine();
String[] values = line.Split(';');
CustomData data = new CustomData();
string value;
for (int i = 0; i < values.Length; i++) {
dict.TryGetValue(i, out value);
Type targetType = data.GetType();
PropertyInfo prop = targetType.GetProperty(value);
if(values[i]==null)
{
prop.SetValue(data, "NULL",null);
}
else
{
prop.SetValue(data, values[i], null);
}
}
dataList.Add(data);
}
【问题讨论】:
-
首先,您不能将整个内存用于 c# 进程。我建议您使用 lumenworks csv 解析器。并且不要使用反射。为什么需要反思?它是 csv 文件。你在折磨自己。
-
查看此内容以获得另一个解释,即您没有自己的所有记忆。 stackoverflow.com/questions/1109558/…
-
你真的必须将整个解析后的数据保存在内存中吗?也许您应该考虑将它们存储在其他地方(数据库?,带有二进制序列化的文件?...)。您能给我们介绍一下您的 CustomData 类定义吗?
-
同意。您可以聚合数据列表。
-
谢谢,但我知道这一点,我只是想知道我是否做错了阅读,似乎很多人在stackoverflow上建议使用streamreader,只是想我可能会以错误的方式使用它。
标签: c#