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

标签 java text parallel-processing stream

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

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

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

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

最佳答案

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

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

一旦加载内容并将其写入磁盘之前,您当然可以并行化搜索,但对于普通文本搜索,速度无法真正提高。

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

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

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

<小时/>

顺便尝试将执行时间分为以下部分:

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

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

关于Java:并行过滤大文本文件,同时保持顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54535457/

相关文章:

java - Hibernate ManyToMany 更新时加入表问题

javascript - "textLength"Internet Explorer 中 svg 文本元素悬停时发生变化

python - 解析具有正确名称的空格分隔行

matlab - 如何在 MATLAB 中显示米勒指数?

python - 在 Python 中处理大文件的最快方法

java - 如何使用 Apache Camel/Spring-boot 订阅持久主题?

java - 对于在 ADODB 中反序列化值的特殊情况,我如何将 PHP preg_split 移植到 Java?

java - 我们可以在 oozie 决策节点中使用参数吗?

parallel-processing - 语言/MPI : Is it possible to declare a variable on a single processor only?

c++ - 并行化时的不同答案