5

我正在编写一个需要处理大型文本文件的应用程序(以逗号分隔的几种不同类型的记录 - 我没有权力或倾向于更改数据存储格式)。它读入记录(通常是按顺序读取文件中的所有记录,但并非总是如此),然后将每条记录的数据传递给某些处理。

现在应用程序的这一部分是单线程的(读取一条记录,处理它,读取下一条记录等)我认为在一个线程中读取队列中的记录并在另一个线程中处理它们可能更有效线程在小块或它们变得可用时。

我不知道如何开始编写类似的程序,包括必要的数据结构或如何正确实现多线程。任何人都可以提供任何指示,或提供其他关于我如何提高性能的建议吗?

4

3 回答 3

3

如果您可以平衡处理记录的时间和阅读记录的时间,您可能会受益;在这种情况下,您可以使用生产者/消费者设置,例如同步队列和工作人员(或几个)出列和处理。我也可能想研究并行扩展;编写阅读代码的版本非常容易,之后(或其他方法之一)实际上应该做你想做的一切;例如:IEnumerable<T>Parallel.ForEachParallel

static IEnumerable<Person> ReadPeople(string path) {
    using(var reader = File.OpenText(path)) {
        string line;
        while((line = reader.ReadLine()) != null) {
            string[] parts = line.Split(',');
            yield return new Person(parts[0], int.Parse(parts[1]);
        }
    }
}
于 2010-01-20T21:49:33.163 回答
1

看看这个教程,它包含你需要的一切......这些是微软教程,包括你描述的类似案例的代码示例。您的生产者填满队列,而消费者弹出记录。

线程之间的创建、启动和交互

同步两个线程:生产者和消费者

于 2010-01-20T21:48:09.313 回答
1

您还可以查看异步 I/O。在这种风格中,您将从主线程开始一个文件操作,然后它将继续在后台运行,当它完成时,它会调用您指定的回调。同时,您可以继续做其他事情(例如处理数据)。例如,您可以启动一个异步操作来读取接下来的 1000 个字节,然后处理您已经拥有的 1000 个字节,然后等待下一个千字节。

不幸的是,用 C# 编写异步操作有点痛苦。有一个MSDN 示例,但它一点也不好看。这可以在 F# 中使用异步工作流很好地解决。我写了一篇文章来解释这个问题,并展示了如何使用C# 迭代器来做类似的事情。

C# 更有前途的解决方案是 Wintellect PowerThreading 库,它支持使用 C# 迭代器的类似技巧。Jeffrey Richter在MSDN Concurrency Affairs中有一篇很好的介绍性文章。

于 2010-01-20T22:18:16.667 回答