像Parallel.ForEach File.Readling之类的东西 - 但是不是readline,而是从指定的索引中读取?

时间:2017-08-02 13:18:00

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

我有很大的文本文件(1GB +)。所以我在考虑是否可能出现以下内容:

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

示例

TEXTFILE:

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

int array = {0,10,20};

3个线程的Parallel.ForEach:

  1. 以字符0到9开头的ReadFile
  2. 以字符10到19开头的ReadFile
  3. ReadFile从字符20开始结束
  4. 1 GB只是一个文件。我们每隔10/24全天候收到一个这样的文件。

1 个答案:

答案 0 :(得分:1)

并行for循环将加速从大文本文件中读取。鉴于您每10秒24小时获得1GB文件,因此实现Parallel.For循环是值得的。

David Lozinski在阅读文本文件时运行many tests (1),然后比较parallelism to regular for loops (所有示例均来自David Lozinski。)< / em>的

对于行长度相当于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.kaisersmith

the comments的此链接