我的目标:我要总结一个 1 GB 的 csv 文件。假设该文件具有“字段”/列 AM。我想将某些字段小计到另一个字段上,比如 A。我想要的结果是字段 A 中的每个值以及其他三个字段的小计 - 比如 B、G 和 L。
问题:我正在尝试使用 LINQ 查询来处理此问题,但会引发 Out of Memory 异常。
这是我的查询:
Dim summarizedRecs = From line In System.IO.File.ReadLines(filepath)
Skip 1
Let e = New aRecord(line)
Group e
By e.A
Into g = Group
Select summarizedR = New With {
A,
.TotalB = g.Sum(Function(x) x.B),
.TotalG = g.Sum(Function(x) x.G),
.TotalL = g.Sum(Function(x) x.L)}
Order By summarizedR.A
aRecord
是一个简单的类,它的构造函数接受一行文本并将该行解析为适当的字段。这很好用。
这种方法适用于 ~ 100 MB 的较小文件。对于 100 MB 文件和 1 GB 文件,应用程序使用的内存会随着运行时间的增加而增加。
我怀疑 LINQ 组不是我想要的,但我不确定另一种 LINQ 方法。有吗?
我认为 LINQ 将我所有的 e 实例保留在组中。最后,我不需要 e 组。在将每个 e 的字段添加到适当的组之后,可以处置该 e。我只想要来自 e 组的结果小计。
我也一起跳过了 LINQ,并使用 Dictionary(Of T1, T2) 成功实现了这一点。这样做,我阅读了每一行文本,创建了一个 aRecord 的实例并将其总数应用于字典中适当的键值对。在这种方法中,只有一个 aRecord 实例。这在内存方面是有效的——消耗的内存趋于平稳并保持相对较低。
因此 Dictionary 方法适用于 1 GB 文件。有没有 LINQ 替代方案?