假设我的 SSD 上有一个非常大的文件,并且有 48 个核心。 我想过滤文本文件(基于行的文本文件),并只留下某些句子。然后我想将过滤后的内容写入一个新文件,同时保持原始顺序。
我认为Java并行流不会保持顺序。
我的想法是这样的:创建 48 个点来均匀地分割文件,然后调整指针以从新行开始,然后创建 48 个线程,每个线程处理不同的 block 并过滤行(并将结果保存在内存中 - 结果比原始文件小得多),然后取出 48 个点并将它们逐个写入一个文件。
这是正确的方法吗?是否有适合它的 Java 框架,还是应该从头开始编写?
最佳答案
在这种特定情况下,在多线程环境中工作不会提高您的性能。
您正在执行繁重的 IO 操作(读取和写入磁盘),而这些操作无法由不同的线程完成。
一旦加载内容并将其写入磁盘之前,您当然可以并行化搜索,但对于普通文本搜索,速度无法真正提高。
在尝试应用复杂的多线程算法之前请考虑:
- 编码时间取决于IO操作? (网络、磁盘、数据库...)
如果是,并且微积分并不繁重,那么花大量时间尝试加快微积分阶段并不是一个好主意,因为 IO 操作发生的时间比内存操作慢数百或数千。
<小时/>顺便尝试将执行时间分为以下部分:
- 将文件加载到内存中
- 搜索短语
- 将结果写入磁盘
如果第二阶段确实比其他阶段更快,并行化不是一个好的解决方案,但您必须尝试其他解决方案。
关于Java:并行过滤大文本文件,同时保持顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54535457/