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

day*_*mer 5 java parallel-processing file-io akka typesafe

这是设计和代码问题的很大结合。

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

替代方案 1
- 打开文件(同步),读取每一行,生成POJOs

FileActor -> read each line -> List<POJO>  
Run Code Online (Sandbox Code Playgroud)

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

替代方案 2
- 打开文件(同步),读取N行(N可配置),传递给不同的参与者进行处理

                                                    / LogLineProcessActor 1
FileActor -> LogLineProcessRouter (with 10 Actors) -- LogLineProcessActor 2
                                                    \ LogLineProcessActor 10
Run Code Online (Sandbox Code Playgroud)

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

问题
- 以上选择是一个不错的选择吗?
- 有更好的选择吗?

请在此提供宝贵的想法

多谢

Bal*_*des 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*/);
Run Code Online (Sandbox Code Playgroud)

您可能需要对线程池进行一些调整,因为paralell()默认情况下是使用 执行的ForkJoinPool.commonPool(),并且您无法真正自定义它以实现最大性能,但人们似乎也找到了解决方法,这里有一些关于该主题的内容