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

时间:2010-03-02 08:54:14

标签: java multithreading

我正在考虑如何在程序中使用线程。 现在我有一个单线程程序,读取一个巨大的文件。非常简单的程序,只是逐行读取并收集有关单词的一些统计信息。 现在,我想使用多线程来加快速度。我不确定如何处理这个问题。

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

谢谢!

4 个答案:

答案 0 :(得分:10)

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

还要考虑:如果您的文件位于硬盘驱动器上:您将如何安排读取?你冒着添加硬盘寻道延迟的风险,否则会阻止所有已经设法完成工作的线程,而一个线程要求硬盘寻找位置0x03457000 ......

答案 1 :(得分:2)

您可以查看producer-consumer方法。这是一个经典的线程问题,其中一个线程产生数据(在您的情况下是读取文件的数据)并将其写入共享缓冲区,另一个线程从该共享缓冲区读取作为您的计算线程的数据(使用者)(某些{{3} })。

另请查看Javas Java examples

答案 2 :(得分:2)

多线程磁盘访问速度更快的假设可能是错误的,如此处的谴责:Directory walker on modern operating systems slower when it's multi-threaded?

通过在单独的线程中拆分数据的读取和处理,可以实现性能提升。

但是等一下,逐行阅读文件?这听起来不是最佳的。最好将它们作为字符串读取(使用FileReader)。

See this sun tutorial.

答案 3 :(得分:1)

如果您的问题是I / O Bound,也许您可​​以考虑将数据拆分为多个文件并将其放入分布式文件系统(如Hadoop Filesystem(HDFS))中,然后对其运行Map / Reduce操作?

相关问题