首页 > 解决方案 > Java:在保持顺序的同时并行过滤大型文本文件

问题描述

假设我在 SSD 上有一个非常大的文件,并且有 48 个内核。我想过滤文本文件(基于行的文本文件),只留下某些句子。然后我想将过滤后的内容写入一个新文件,同时保持原来的顺序。

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

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

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

标签: javatextparallel-processingstream

解决方案


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

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

一旦加载了内容并将其写入磁盘之前,您肯定可以并行化搜索,但对于普通的文本搜索,速度并不能真正提高。

在尝试应用复杂的多线程算法之前考虑一下:

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

如果是,并且微积分并不繁重,那么花费大量时间来加快微积分阶段并不是一个好主意,因为 IO 操作的发生时间比内存操作慢数百或数千倍。


顺便说一下,尝试将执行时间拆分为以下部分:

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

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


推荐阅读