【发布时间】:2016-11-08 06:21:47
【问题描述】:
2016 年 11 月 14 日更新,因为我看到一些答案(非常感谢)要求提供更多详细信息...
语言:VB.Net / Framework: 4.5
尊敬的 TPL 专家,我是任务处理库 (TPL) 的新手,希望在以下方面提供任何帮助:
我需要处理一个大文件(数十万条记录)。每条记录是一个制表符分隔的记录,最多包含 4 个字段。
对于读取的每条记录,我需要提取字段并调用 asnyc 任务来处理这些字段。
显然,我需要通过一次最多允许处理 10 记录来限制进程,即一次最多启动 10 任务。
例如,如果我读取了第一条10 记录,那么10 任务将被启动。如果任何一项任务完成,我会读取下一条记录并开始另一项任务,依此类推,直到文件结束。基本上,我想优化我可以同时读取和处理的记录数。
到目前为止,这是我想出的:
rec_list = New StreamReaderEnumerable( file_spec )
For each rec In rec_list
task_list.Add( Task.Run( Async Function()
Return Await task_func( rec )
End Function
)
)
If ( task_list.Count >= 10 ) Then
Task.WhenAll( task_list )
task_list.Clear()
End If
Next
“StreamReaderEnumerable”类用于一次从文件中返回一条记录(作为 Enumerable 源),然后我将任务添加到列表中,以便一次处理 10 个任务。
没有必要维护任何类型的顺序,因为每个任务都可能随时完成——我只是想提高一次处理多于一个记录的效率。
问题是,我目前正在等待所有 10 项任务完成,然后才能继续。最好能进一步优化。
我想我正在寻找的是一个 ForEachAsync 类型的枚举器——但还没有找到任何明确的例子......
我们将不胜感激。
【问题讨论】:
-
听起来像是TPL Dataflow 的完美工作 会用它写一个例子,但我不太了解 vb 来获得正确的语法。
-
你想从事什么样的工作?使用正则表达式而不是字符串拆分可以轻松地将速度提高 10 倍,因为它不会生成/清理临时字符串。这些临时字符串在处理大文件时会非常快速增加
-
内存使用量可以从 2GB 到 50-100MB,具体取决于您的操作。分配和清理 1.9 GB 的小字符串需要 很多 CPU
-
寻找使用现有 .Net Framework 的解决方案 - TPL 数据流命名空间未随 4.5 分发,请参阅:msdn.microsoft.com/en-us/library/hh228603(v=vs.110).aspx
标签: .net vb.net task-parallel-library