代码之家  ›  专栏  ›  技术社区  ›  Nathan B

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

  •  1
  • Nathan B  · 技术社区  · 6 年前

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

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Davide Lorenzo MARINO    6 年前

    在这个特定的上下文中,在多线程环境中工作不会提高性能。

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

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

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

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

    如果是的,并且微积分不重,那么花很多时间尝试加速微积分阶段不是一个好主意,因为IO操作比内存中的操作慢上百或数千倍。


    顺便试着把执行时间分成以下几个部分:

    • 将文件加载到内存中
    • 搜索短语

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