【发布时间】:2017-05-30 16:44:56
【问题描述】:
我有一个包含 100 个 .txt 文件的文件夹,每个文件 20 或 + MB。
所有文件都有大约2*10^5 lines of UTF-8 encoded text。
什么是可能使用多线程来查找哪些文件包含固定密钥字符串的最快方法? (包含的条件与 java .contains() 函数相同,即普通子字符串)。
我在 SO 上找到了几种方法,但没有使用 multithreading(为什么?),而且它们似乎都根据要求改变速度,我似乎无法理解哪个的方法对我来说更好。
例如这个超级复杂的方法:
似乎比使用BufferedReader 和.contains() 函数的简单逐行搜索慢2 倍。怎么可能?
如何才能充分发挥多线程的潜力?该程序在非常强大的多核机器上运行。
我要查找的输出是哪些文件包含该字符串,以及可能在哪一行。
【问题讨论】:
-
多线程在最好的情况下是复杂的,在大多数情况下,为人们提供单线程解决方案更简单,这样他们就可以理解问题的解决方案,而不是增加可能进一步混淆他们的复杂性,这就是“为什么”。多线程也并不总能带来(显着)性能提升,因此您需要进行一些测试以了解优势在哪里。我的一般建议是从
ExecutorService -
甚至可能是
ThreadPoolExecutor,这样您就可以更好地控制活动线程的数量。这样,您可以将所有想要完成的任务转储到执行程序中并等待结果(以多种方式之一) -
根据您的硬件,文件扫描不会受益于多线程,因为性能瓶颈是硬盘。但正如我所说,这取决于 CPU 与磁盘的性能。也许 2 或 3 个线程会扫描得更快,但 100 个线程可能会完全降低性能。
-
如果文件是静态的并且您打算多次搜索它们,那么为什么不为它们创建索引。这将比每次从头开始扫描它们要快得多。如果它们是动态的,那么只需根据文件更改事件相应地更新索引。这就是我想做的事情。这就是数据库如此出色的原因,它们可以索引所有内容并具有查询语言。
-
我正在考虑将文件分成 8 个组,并在不同的线程上解析每个组(我只是在这里假设,但我想这是最佳数字,因为 cpu 的核心(它是英特尔 i7))。这些文件都在同一个磁盘上,这是一个高端、非常快的 SSD。不过我可能完全不在了。我不知道磁盘如何处理多线程。
标签: java string multithreading parsing