Java:并行过滤大型文本文件,同时保持顺序

时间:2019-02-05 13:24:15

标签: java text parallel-processing stream

假设我的SSD上有一个很大的文件,有48个内核。 我想过滤文本文件(基于行的文本文件),仅保留某些句子。然后我想将过滤后的内容写到一个新文件中,同时保持原始顺序。

我认为Java并行流不会保持顺序。

我的想法是这样的:创建48个均匀分割文件的点,然后调整指针以开始新行,然后创建48个线程,每个线程处理不同的块并过滤行(并保存结果)在内存中-结果比原始文件要小得多),然后取48件并将它们依次写到一个文件中。

这是正确的方法吗,是否有Java框架,还是应该从头开始编写?

1 个答案:

答案 0 :(得分:0)

在这种特殊情况下,在多线程环境中工作不会提高性能。

您正在执行繁重的IO操作(读取和写入磁盘),而这些操作是不同线程无法完成的。

在加载内容之后并将其写入磁盘之前,您当然可以并行化搜索,但是对于普通的文本搜索,速度并不能真正提高。

在尝试应用复杂的多线程算法之前,请考虑以下问题:

  • 编码时间取决于IO操作? (网络,磁盘,数据库...)

如果是,并且演算并不繁重,那么花很多时间尝试加快演算阶段不是一个好主意,因为IO操作发生的时间比内存操作要慢一百或几千个时间。


通过尝试将执行时间划分为以下几个部分:

  • 将文件加载到内存中
  • 搜索短语
  • 将结果写入磁盘

如果第二阶段确实比其他阶段更快,那么并行化不是一个好的解决方案,但是您必须尝试其他解决方案。