我正在考虑如何在程序中使用线程。 现在我有一个单线程程序,读取一个巨大的文件。非常简单的程序,只是逐行读取并收集有关单词的一些统计信息。 现在,我想使用多线程来加快速度。我不确定如何处理这个问题。
一种解决方案是预先将数据分成X个片段,然后有X个线程,每个线程同时在一个片段上运行,使用一个同步方法将统计信息写入内存。有更好的方法吗?具体来说,我想避免提前分离数据。
谢谢!
答案 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
)。
答案 3 :(得分:1)
如果您的问题是I / O Bound,也许您可以考虑将数据拆分为多个文件并将其放入分布式文件系统(如Hadoop Filesystem(HDFS))中,然后对其运行Map / Reduce操作?