Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Multithreading - Fatal编程技术网

在Java中使用多线程读取数据

在Java中使用多线程读取数据,java,multithreading,Java,Multithreading,我在想我应该如何在我的程序中使用线程。 现在我有一个单线程程序,可以读取一个巨大的文件。非常简单的程序,只需逐行阅读并收集有关单词的统计信息。 现在,我想使用多线程来提高速度。我不知道该怎么做 一种解决方案是预先将数据分成X个部分,然后有X个线程,每个线程同时在一个部分上运行,使用一种同步方法将统计数据写入内存。有更好的方法吗?具体来说,我希望避免提前分离数据 谢谢 首先,进行一些分析,以确保您的进程实际上是计算绑定的,而不是I/O绑定的。也就是说,您的统计信息收集比访问文件慢。否则,多线程将降

我在想我应该如何在我的程序中使用线程。 现在我有一个单线程程序,可以读取一个巨大的文件。非常简单的程序,只需逐行阅读并收集有关单词的统计信息。 现在,我想使用多线程来提高速度。我不知道该怎么做

一种解决方案是预先将数据分成X个部分,然后有X个线程,每个线程同时在一个部分上运行,使用一种同步方法将统计数据写入内存。有更好的方法吗?具体来说,我希望避免提前分离数据


谢谢

首先,进行一些分析,以确保您的进程实际上是计算绑定的,而不是I/O绑定的。也就是说,您的统计信息收集比访问文件慢。否则,多线程将降低程序的速度,而不是加快程序的速度,特别是在单核CPU(或旧JVM)上运行时


还要考虑:如果您的文件驻留在硬盘上:您将如何安排读取?否则,您可能会增加硬盘寻道延迟,使所有已成功完成其大块工作的线程暂停,而一个线程正在请求硬盘寻道定位0x03457000

你可以看看这个方法。这是一个典型的线程问题,其中一个线程生成数据(在您的情况下是读取文件的线程)并将其写入共享缓冲区,另一个线程从该缓冲区读取数据(消费者),这是您的计算线程(一些)


还可以看一看Java。

多线程磁盘访问速度更快的假设可能是错误的,正如这里所说:

性能改进可以通过在单独的线程中拆分数据的读取和处理来实现

但是等等,逐行读取文件?这听起来并不理想。最好将它们作为字符流读取(使用
FileReader


< p>如果你的问题是I/O绑定,也许你可以考虑把你的数据分割成多个文件,并把它放到一个分布式文件系统中,比如Hadoop文件系统(HDFS),然后在它上运行Map /Read操作?< /P> + 1,我必须找到它的硬路。I/O绑定进程并不总是多线程友好的,实际上可能会比单线程I/O提供更低的性能。IMO使用缓冲读/写通常会加快基于磁盘的I/O速度。+1:它永远不会停止为真-先测量,然后优化。您的文件有多大?您的机器配置是什么?