gpt4 book ai didi

c# - CsvHelper 并并行查询大型 csv 文件

转载 作者:行者123 更新时间:2023-12-02 00:55:28 26 4
gpt4 key购买 nike

我有一个 3.6 gig 的 csv 文件。我正在使用 CsvHelper 来处理它。当我使用 linq 查询它时,它需要几分钟,我发现我的 PC 上的 CPU 最多只用了大约 25%。执行此操作时,Linq 似乎可以很好地处理内存,因为它根本不会增加太多。

所以我认为通过添加 .AsParallel() 我应该可以看到一些性能提升。当我用它运行它时,我看到我的 CPU 上升到大约 95%,但它需要同样长的时间。

为什么我看不到 .AsParallel() 的性能提升,有什么方法可以通过它获得更好的性能(将其保留为 csv)。

string path = @"C:\my_3_gig_file.csv";

using (var csv = new CsvHelper.CsvReader(new StreamReader(path, Encoding.Default)))
{
csv.Configuration.Delimiter = ",";
csv.Configuration.TrimFields = true;
var records = csv.GetRecords<MyClass>();

var q1 = (from a in records.AsParallel()
where a.MY_HOUR == "1"
&& a.MY_DATE == "14-JUN-13"
select a).ToList();
}

最佳答案

尝试并行处理行不会有任何收获,因此尝试没有意义。您只能使用 CsvHelper 线性读取和处理文件。即便如此,也没有足够的工作来证明行的并行处理是合理的。可能伤害你的是建立每一个被读取的记录。如果有很多列,那么每行需要进行大量处理。

您正在尝试从文件中过滤出要使用的行。您应该直接读入行,检查列,然后边做边建立记录。这样,您就不会浪费大量时间为每一行构建记录,而只是可能将其丢弃。

这是您可以执行此操作的一种方法。

List<T> GetCsvRecordsFiltered<T>(string path, Func<CsvReader, bool> filter, Action<CsvConfiguration> configure = null) where T : class
{
using (var file = File.OpenText(path))
using (var reader = new CsvReader(file))
{
configure?.Invoke(reader.Configuration);
var result = new List<T>();
while (reader.Read())
if (filter(reader))
result.Add(reader.GetRecord<T>());
return result;
}
}

然后当你读取文件时,你会这样做:

var q1 = GetCsvRecordsFiltered<MyClass>(path,
reader => reader["MY_HOUR"] == "1" && reader["MY_DATE"] == "14-JUN-13",
config => config.TrimFields = true
);

关于c# - CsvHelper 并并行查询大型 csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35924926/

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