Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 并行文件处理:推荐的方法有哪些?_Java_File Io_Parallel Processing_Akka_Typesafe - Fatal编程技术网

Java 并行文件处理:推荐的方法有哪些?

Java 并行文件处理:推荐的方法有哪些?,java,file-io,parallel-processing,akka,typesafe,Java,File Io,Parallel Processing,Akka,Typesafe,这主要是设计和代码问题的结合 用例 -给定范围(2MB-2GB)内的许多日志文件,我需要解析这些日志并应用一些处理,生成JavaPOJO -对于这个问题,我们假设只有1log文件 -同时,这个想法是为了充分利用这个系统。多核可供选择 备选方案1 -打开文件(同步),读取每一行,生成POJOs FileActor -> read each line -> List<POJO> 优点通过使用不同的参与者处理部分行,实现一些并行化。参与者将利用系统中可用的核心(?如何,可

这主要是设计和代码问题的结合

用例
-给定范围(2MB-2GB)内的许多日志文件,我需要解析这些日志并应用一些处理,生成Java
POJO

-对于这个问题,我们假设只有
1
log文件
-同时,这个想法是为了充分利用这个系统。多核可供选择

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

FileActor -> read each line -> List<POJO>  
优点通过使用不同的参与者处理部分行,实现一些并行化。参与者将利用系统中可用的核心(?如何,可能?)
Cons仍然是串行的,因为文件是以串行方式读取的

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

请在此提供宝贵的想法


非常感谢

为什么不利用已有的功能,使用JDK1.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()
执行的,并且您无法真正对其进行自定义以实现最大性能,但人们似乎也找到了解决方法。

备选方案2看起来不错。我会改变一件事。尽可能读取最大的文件块。如果你在短时间内完成任务,IO将是一个问题。 由于有几个文件,我将创建一个actor来获取文件名,读取一个特定的文件夹。然后将每个文件的路径发送到
LogLineReader
。它将读取文件的一大块。最后,它将把每一行发送到
LogLineProcessActor
。 请注意,他们可能会处理出顺序的线路。如果这不是一个问题,他们会让你的CPU忙


如果你喜欢冒险,您也可以尝试新的。

我认为可能适合您的问题。或者,即使您不断获得新文件,并且想要一个真正强大的管道。此解决方案需要安装在客户机器上,因此我不确定
Storm
是否可行。如果它是用于分析的日志文件,您可能还可以使用
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*/);