并行文件处理:推荐的方法是什么?

时间:2015-05-07 18:54:46

标签: java file-io parallel-processing akka typesafe

这是设计和代码问题的大量组合。

使用案例
- 鉴于范围内的许多日志文件(2MB - 2GB),我需要解析每个日志并应用一些处理,生成Java POJO。 - 对于这个问题,我们假设我们只有1日志文件
- 此外,我们的想法是充分利用系统。可以使用多个核心。

备选方案1
- 打开文件(同步),读取每一行,生成POJO s

FileActor -> read each line -> List<POJO>  

优点 :简单易懂 缺点 :串行进程,没有利用系统中的多个核心

备选方案2
- 打开文件(同步),读取N行(N是可配置的),传递给不同的actor来处理

                                                    / LogLineProcessActor 1
FileActor -> LogLineProcessRouter (with 10 Actors) -- LogLineProcessActor 2
                                                    \ LogLineProcessActor 10

优点 一些并行化,通过使用不同的actor来处理部分行。演员将利用系统中的可用核心(?如何,可能?) 缺点 仍然是串行的,因为文件以串行方式读取

问题
- 以上任何一种选择都是不错的选择吗? - 有更好的选择吗?

请在此提供有价值的想法

非常感谢

1 个答案:

答案 0 :(得分:2)

为什么不利用已有的功能,并使用jdk 1.8附带的并行流内容?我会从这样的事情开始,看看它是如何表现的:

Files.lines(Paths.get( /* path to a log file */ ))
     .parallel() // make the stream work paralell
     .map(YourBean::new) // Or some mapping method to your bean class
     .forEach(/* process here the beans*/);

您可能需要对线程池进行一些调整,因为默认情况下paralell()是使用ForkJoinPool.commonPool()执行的,并且您无法真正自定义它以获得最佳性能,但人们似乎找到了解决方法那也是some stuff about the topic here