【问题标题】:Something like Parallel.ForEach File.Readling - but instead of readline, read from specified indexes?像 Parallel.ForEach File.Readling 之类的东西 - 但不是 readline,而是从指定的索引读取?
【发布时间】:2017-08-02 13:17:59
【问题描述】:

我有巨大的文本文件 (1GB+)。所以我在想是否可能会出现以下情况:

  • ReadFile 并创建一个带有起始索引/位置的 int 数组
  • 使用 Parallel.ForEach 从所有索引开始读取文件,直到到达下一个索引或特定字符

示例

文本文件:

"I am a test file. Please use me. You used me. Urraaaaaaaaaay!"

int array = {0,10,20};

Parallel.ForEach 有 3 个线程:

  1. ReadFile 以 0 到 9 的字符开始
  2. ReadFile 以 10 到 19 的字符开头
  3. ReadFile 从第 20 个字符开始到结束

1 GB 只是一个文件。我们每 10 秒 24/7 得到一个这样的文件。

【问题讨论】:

  • 除非您对数据进行 CPU 密集型处理,否则我认为没有什么意义。读取文件的瓶颈不是 CPU,而是硬盘。
  • 我同意@Rotem 的观点,也就是说,创新很棒,试一试,让我们知道它的效果。
  • 你是对的。我忘了硬盘是瓶颈。不是CPU。现在我首先通过文件删除和添加 RETURNS,然后我使用标准的 Parallel.ForEach 和 ReadLine。
  • 1GB 不是很大。

标签: c# string performance parallel-processing text-files


【解决方案1】:

并行 for 循环将加快读取大型文本文件的速度。鉴于您 24/7 每 10 秒获得一个 1GB 的文件,那么实现 Parallel.For 循环是值得的。

David Lozinski 在读取文本文件时运行many tests (1),然后比较parallelism to regular for loops (所有示例均取自或改编自David Lozinski。)

对于行长相当于 5 个 GUID(160 个字符)的文本文件,使用 ReadAllLines 将文本添加到数组中会更快。

例如:

AllLines = new string[MAX]; //only allocate memory here
AllLines = File.ReadAllLines(fileName);

对于具有较长行(> 10 个 GUID 或 320 个字符)的文本文件,使用 ReadLine 和使用或不使用 BufferedStream 创建数组会稍微快一些。

AllLines = new string[MAX]; //only allocate memory here
using (StreamReader sr = File.OpenText(fileName))
{
    int x = 0;
    while (!sr.EndOfStream)
    {
           AllLines[x] = sr.ReadLine();
           x += 1;
    }
} // The using will dispose of any resources.

然后在 Parallel For 循环中处理该数组。

Parallel.For(0, AllLines.Length, x =>
{
    YourFile Processing(AllLines[x]);
});

这应该会显着加快处理时间,尽管这也取决于运行程序的机器、它的 CPU 以及可用于传播并行进程的线程数。

(1) 感谢jason.kaisersmiththe comments 中提供此链接

【讨论】:

    猜你喜欢
    • 2016-06-06
    • 2020-10-12
    • 1970-01-01
    • 2016-02-23
    • 2023-03-14
    • 2012-06-04
    • 1970-01-01
    • 2013-03-29
    • 2019-10-29
    相关资源
    最近更新 更多