gpt4 book ai didi

c# - 解析一个大的 CSV 文件 C# .net 4

转载 作者:太空宇宙 更新时间:2023-11-03 19:22:08 27 4
gpt4 key购买 nike

我知道以前有人问过这个问题,但我似乎无法用我读过的答案来解决这个问题。我有一个 CSV 文件 ~ 1.2GB,如果我像 32 位一样运行进程,我会得到 outOfMemoryException,如果我将它作为 64 位进程运行它会工作,但它仍然需要 3.4gb 的内存,我知道我在我的 customData 类中存储了很多数据,但仍然有 3.4gb 的 ram?,我在读取文件时做错了什么吗?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);
}

最佳答案

你的stream reader的使用好像没有什么问题,你在内存中读了一行,然后忘记了。

但是,在 C# 中,字符串在内存中编码为 UTF-16,因此平均一个字符在内存中占用 2 个字节。

如果您的 CSV 还包含许多您转换为 "NULL" 的空字段,您最多为每个空字段添加 7 个字节。

总的来说,由于您基本上将文件中的所有数据都存储在内存中,因此您需要内存中文件大小的近 3 倍也就不足为奇了。

实际的解决方案是通过 N 行的 block 来解析您的数据,处理它们,并将它们从内存中释放。

注意:考虑使用 CSV 解析器,CSV 不仅仅是逗号或分号,如果您的字段之一包含分号、换行符、引号怎么办... . ?

编辑

实际上每个字符串在内存中最多占用 20+(N/2)*4 个字节,请参阅 C# in Depth

关于c# - 解析一个大的 CSV 文件 C# .net 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11466107/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com