.net 小计,而不是组,使用LINQ?
我的目标是:我有一个1 GB的csv文件,我正试图总结。假设文件中有“fields/”列A-M。我希望某些字段在另一个字段(例如A)上进行小计。我希望的结果是字段A中的每个值以及其他三个字段(例如B、G和L)的小计 问题是:我试图用LINQ查询来处理这个问题,但是会抛出内存不足异常 我的问题是:.net 小计,而不是组,使用LINQ?,.net,vb.net,linq,.net,Vb.net,Linq,我的目标是:我有一个1 GB的csv文件,我正试图总结。假设文件中有“fields/”列A-M。我希望某些字段在另一个字段(例如A)上进行小计。我希望的结果是字段A中的每个值以及其他三个字段(例如B、G和L)的小计 问题是:我试图用LINQ查询来处理这个问题,但是会抛出内存不足异常 我的问题是: Dim summarizedRecs = From line In System.IO.File.ReadLines(filepath) Skip 1 Let e = New
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,并使用一个字典(T1,T2)成功地实现了这一点。这样,我阅读每一行文本,创建一个aRecord实例,并将其总数应用到字典中相应的键值对。在这种方法中,只有一个aRecord实例。这是一种高效的内存方式——内存消耗趋于平稳,并保持相对较低的水平
因此,字典方法适用于1GB文件。但是有LINQ替代方案吗?坚持使用
字典解决方案没有什么错,但是如果您想使用LINQ,可以使用聚合:
Dim summarizedRecs = File.ReadLines(filepath) _
.Skip(1) _
.Select(Function(line) New aRecord(line))
.Aggregate(New Hashtable(), Function(acc, cur)
acc(cur.A) += cur : Return acc
End Function)
以及一个aRecord
类,为了方便起见,该类实现了+
-运算符:
Private Class aRecord
Public Property A As String
Public Property B As Integer
Public Property G As Integer
Public Property L As Integer
Public Shared Operator +(a As aRecord, b As aRecord) As aRecord
If a is Nothing Then Return b
Return New aRecord() With { _
.A = a.A, _
.B = a.B + b.B, _
.G = a.G + b.G, _
.L = a.L + b.L _
}
End Operator
End Class
我在这里使用Hashtable
而不是Dictionary
,因为Hashtable
如果找不到特定的键,就会返回Nothing
,并在+
-运算符中滥用这一事实(只是为了保存一些代码行)
我也不知道您的aRecord
类的其他功能,但在本例中,我滥用它来存储累积字段B
、G
、和L
(同样是为了保存一些代码行)
但是,在现实世界的应用程序中,我可能会对每个
循环使用一个简单的,而不是试图变得聪明。坚持使用您的字典
解决方案没有错,但是如果您想使用LINQ,您可以使用聚合
:
Dim summarizedRecs = File.ReadLines(filepath) _
.Skip(1) _
.Select(Function(line) New aRecord(line))
.Aggregate(New Hashtable(), Function(acc, cur)
acc(cur.A) += cur : Return acc
End Function)
以及一个aRecord
类,为了方便起见,该类实现了+
-运算符:
Private Class aRecord
Public Property A As String
Public Property B As Integer
Public Property G As Integer
Public Property L As Integer
Public Shared Operator +(a As aRecord, b As aRecord) As aRecord
If a is Nothing Then Return b
Return New aRecord() With { _
.A = a.A, _
.B = a.B + b.B, _
.G = a.G + b.G, _
.L = a.L + b.L _
}
End Operator
End Class
我在这里使用Hashtable
而不是Dictionary
,因为Hashtable
如果找不到特定的键,就会返回Nothing
,并在+
-运算符中滥用这一事实(只是为了保存一些代码行)
我也不知道您的aRecord
类的其他功能,但在本例中,我滥用它来存储累积字段B
、G
、和L
(同样是为了保存一些代码行)
但是,在现实世界的应用程序中,我可能会对每个
循环使用一个简单的,而不是试图变得聪明。你知道术语数据库吗?;-)除此之外,如果字典方法有效,就使用它。是的,是的,是的。。。当前没有对一个的写入/导入访问权限。就结果而言,SQL GROUP BY就是我想要的。你知道术语数据库吗?;-)除此之外,如果字典方法有效,就使用它。是的,是的,是的。。。当前没有对一个的写入/导入访问权限。就结果而言,SQL GROUP BY就是我想要的。我肯定不知道如何使用聚合。那很有帮助。我希望有一种使用匿名类型的解决方案。我想他们会让切换分组字段或使用多个字段变得更容易。多米尼克,谢谢你的快速响应和非常清晰、清晰的记录。我肯定不知道如何使用聚合。那很有帮助。我希望有一种使用匿名类型的解决方案。我想他们会使切换分组字段或使用多个字段变得更容易。多米尼克,谢谢你的快速响应和非常清晰、清晰的文字。