【发布时间】:2019-04-24 20:55:03
【问题描述】:
我必须处理大型 CSV 文件(高达数十 GB),如下所示:
Key,CompletedA,CompletedB
1,true,NULL
2,true,NULL
3,false,NULL
1,NULL,true
2,NULL,true
我有一个解析器,可以将解析后的行生成为IEnumerable<Record>,因此我一次只能将一行读入内存。
现在我必须按 Key 对记录进行分组,并检查 CompletedA 和 CompletedB 列是否在组内具有值。在输出上,我需要记录,即组内没有 CompletedA,CompleteddB。
在这种情况下,它是用键 3 记录的。
但是,在同一个数据集上会有许多类似的处理,我不会多次迭代它。
我想我可以将 IEnumerable 转换为 IObservable 并使用 Reactive Extentions 来查找记录。
是否可以在 IObservable 集合上使用简单的 Linq 表达式以节省内存的方式进行操作?
【问题讨论】:
-
当然,你也可以使用管道处理器,比如数据流,orrrr Reactive Extensions,但是,这都是多余的,你可以在 foreach 循环中有效地做到这一点,你会帮自己一个忙尝试这是第一个
-
records.CountBy(z => new { Key = z.Key, Value = z.CompletedA ?? z.CompletedB}).Where(z => z.Value == 1).Select(z => z.Key)可能会帮助您入门。为此,您需要 nuget.org/packages/morelinq。 -
你有多少个不同的
Keys? -
@TheGeneral:这只是众多此类分析之一,我必须在单个 foreach 中完成所有这些分析。 foreach 不适合还有其他原因
-
@DmitryBychenko:“你有多少个不同的键?”:记录数的一半或更多。不确定生产中会有多少行,但考虑到文件大小,很多。
标签: c# system.reactive yield file-processing