如何使用多个线程写入多个文件时解决I / O瓶颈问题

时间:2011-11-15 18:29:00

标签: java multithreading performance file-io

我目前有一个多线程程序,可以抓取网站并将文本写入文件。 CPU方面我可以同时运行大量线程但很快I / O就成了瓶颈。我以为我可以让每个线程写入一个数组阻塞队列,但我知道我将生成超过我可用的32GB内存。有没有办法让Array在达到一定大小后转储到文本文件中,以便我可以释放该空间?或者我是否还有另一种解决这个I / O问题的方法?

4 个答案:

答案 0 :(得分:2)

让我们拍摄一张图像,其中有SATA 2控制器,允许以每秒300 MB的速度写入。现在问题是我们想象中的计算机的互联网连接带宽是什么。我知道以太网适配器支持的最后一个生产最大带宽是每秒1 GB。但我认为这种互联网连接的带宽非常昂贵(我甚至怀疑一些商业主机支持它)。我认为每秒300 MB的Internet连接就足够了。让我们的电脑有这样一个。

结果是

      Input (300 MB/s);

      Writing (300 MB/s).

恢复:如果要下载Internet,则必须增加连接和磁盘以及磁盘控制器。否则300 MB / s看起来很不错。并且线程对你没有帮助。 CPU和内存也与我们的问题无关。

答案 1 :(得分:1)

我不会运行“吨”线程。我会在特定系统上查找不同数量的线程,直到找到提供最大吞吐量的读取器线程数。我怀疑这个数字会很小。基本上,您只需要在等待其他服务器响应时保持CPU忙碌。

我要为你写的每个物理驱动器都有一个编写器线程。使用有限大小的BlockingQueue将读取线程连接到writer线程;如果读者远远超过磁盘,这将限制他们的活动。

答案 2 :(得分:0)

我猜这是因为围绕这么多文件晃动而导致磁盘I / O成为瓶颈,是吗?你能一次编写整个文件 - 抓取网站,将缓冲区添加到缓冲区集合,然后将缓冲区集合排队到一个文件写入线程?顺序写入会提高磁盘性能,是吗?如果缓冲整个站点是不可行的,那么你可以为每个站点收集足够的缓冲区实例以使磁盘写入值,(我不知道,当收集的总量超过64K时),然后从写入器线程排队集合并开始收集一组新的缓冲区。

改善多文件写入延迟的简便方法 - 获取SSD。

答案 3 :(得分:0)

使用更少的线程!他们不会给你买太多东西。整个问题在一端是网络绑定的,另一端是磁盘绑定的。真的没有多少CPU参与。