代码之家  ›  专栏  ›  技术社区  ›  We Are All Monica

C语言中密集的文件I/O和数据处理#

  •  4
  • We Are All Monica  · 技术社区  · 16 年前

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

    现在,应用程序的这一部分是单线程的(读取记录、处理记录、读取下一个记录等)。我认为在一个线程中读取队列中的记录,然后在另一个线程中以小的块或在可用时处理这些记录可能会更有效。

    我不知道如何开始这样的编程,包括必要的数据结构或者如何正确地实现多线程。有人能给我任何建议,或者提供其他关于我如何提高这里的性能的建议吗?

    3 回复  |  直到 14 年前
        1
  •  3
  •   Community Mohan Dere    9 年前

    你 可以 如果你能平衡时间,就可以得到好处 处理 按时间记录 阅读 记录;在这种情况下,您可以使用生产者/消费者设置,例如 synchronized queue 以及一个工人(或几个)排液和处理。我可能还想研究并行扩展;编写一个 IEnumerable<T> 你阅读代码的版本,之后 Parallel.ForEach (或其中一个) Parallel 方法)应该实际执行您想要的所有操作;例如:

    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]);
            }
        }
    }
    
        2
  •  1
  •   Chris Kannon    16 年前

    看看这个教程,它包含了你所需要的一切…这些是Microsoft教程,包括您描述的类似案例的代码示例。当消费者弹出记录时,生产者填充队列。

    Creating, starting, and interacting between threads

    Synchronizing two threads: a producer and a consumer

        3
  •  1
  •   Tomas Petricek    16 年前

    你也可以看看 异步I/O . 在这种样式中,您将从主线程启动一个文件操作,然后它将继续在后台运行,完成后,它将调用您指定的回调。同时,您可以继续执行其他操作(例如处理数据)。例如,您可以启动一个异步操作来读取下一个1000字节,然后处理您已经拥有的1000字节,然后等待下一个千字节。

    不幸的是,在C中编程异步操作有点痛苦。有一个 MSDN sample 但一点也不好。这可以通过使用异步工作流在F中很好地解决。我写了一篇文章解释了这个问题,并展示了如何使用 C# iterators .

    对于C来说,一个更具说服力的解决方案是Wintelect PowerThreading库,它支持使用C迭代器的类似技巧。中有一篇很好的介绍性文章 MSDN Concurrency Affairs 作者:杰弗里·里克特。