【问题标题】:process a file line by line in concurrency way以并发方式逐行处理文件
【发布时间】:2012-12-19 22:37:27
【问题描述】:

现在我正在从事有关数据格式转换的工作。 有一个大文件,比如 10GB,我目前实现的解决方案是逐行读取这个文件,转换每一行的格式,然后输出到一个输出文件。我发现转换过程是一个瓶颈。所以我试图以并发的方式做到这一点。

每一行都是一个完整的单元,与其他行无关。有些行可能会被丢弃,因为该行中的某些特定值不符合需求。

现在我有两个计划:

  1. 一个线程从输入文件中逐行读取数据,然后将行放入队列,几个线程从队列中获取行,转换格式,然后将行放入输出队列,最后一个输出线程从输出队列中读取行并写入输出文件。

  2. 当前有多个线程从输入文件的不同部分读取数据,然后处理该行并通过输出队列或文件锁输出到文件。

请各位大神给点建议好吗?对此,我真的非常感激。

提前致谢!

【问题讨论】:

  • 解决方案 1 更有意义 - 使用多个线程读取/写入文件不会加快进程。
  • (1) 是否必须有一个输出文件,或者是否可以有多个文件,每个文件都包含输出的一部分? (2) 数据在输出文件中出现的顺序是否重要?
  • 也许你应该发布你现有的代码。在您尝试复杂的多线程设计之前,最好先了解一下您当前的算法是否经过优化。
  • 我们在谈论什么样的处理?行可以乱写吗?
  • @NPE 输出文件中的顺序无关紧要。我尝试将所有数据输出到一个输出文件是因为后续的处理函数接口不支持多个文件作为输入,并且它是一个三部分工具,我无法更改其接口。

标签: java concurrency java.util.concurrent


【解决方案1】:

我会选择第一个选项...从小块文件中读取数据通常比一次读取整个文件要慢(取决于文件缓存/缓冲/预读等)。

您可能还需要考虑一种创建输出文件的方法(从不同进程获取所有行,如果需要,可能按正确的顺序)。

【讨论】:

  • “您可能还需要考虑一种创建输出文件的方法”,我无法理解您的意思。顺序无关紧要。你能给我一些解释吗?谢谢~
  • 如果顺序无关紧要,很琐碎,那么过程是:创建文件,为每个线程读取结果并写入,然后关闭文件。如果顺序很重要,则需要线程的某种 ID。
【解决方案2】:

解决方案 1 有意义。

这也可以很好地简单地映射到 Java 的Executor framework。您的主线程读取行并将每一行提交给 Executor 或 ExecutorService。

不过,如果您必须保持订单不变,事情就会变得更加复杂。

【讨论】:

  • 幸运的是,顺序无关紧要:-)
猜你喜欢
  • 2018-06-10
  • 2012-11-30
  • 2017-07-28
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 2017-07-12
相关资源
最近更新 更多