2011-11-15 64 views
0

我现在有一个多线程的程序,抓取网站和写入他们的文本文件中写入多个文件时,解决I/O瓶颈。 CPU明智的我可以同时运行大量的线程,但很快I/O就成为瓶颈。我想我可以让每个线程都写入一个阵列阻塞队列,但是我知道我将会产生比我可用的32GB内存更多的内存。有没有办法在达到一定大小后将阵列转储到文本文件,以便我可以释放该空间?或者是否有另一种解决此I/O问题的方法?如何使用多线程

+0

难道你只是一个使用集合和序列化它?然后,您只需交换您正在写入的对象。 –

+0

我会做一个单线程,这是你的阵列守门人。访问具有某些功能的数组。如果数组达到一定的大小,则启动将磁盘阵列的一部分写出的工作线程。只需使用一个线程,b/c文件将是线性的(如果保持简单),磁盘可能会成为瓶颈,而不是CPU。 – EdH

回答

2

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

结果是

 Input (300 MB/s); 

     Writing (300 MB/s). 

简历:如果你想下载的互联网,你必须增加连接和磁盘以及磁盘控制器。否则300 MB/s看起来相当不错。线程不会帮助你。 CPU和内存也与我们的问题无关。

0

我想这是磁盘I/O是瓶颈所在,因为抖动的周围这么多的文件,是吗?你可以一次写入整个文件 - 抓取网站,将缓冲区添加到缓冲区集合,然后将缓冲区集合排队到一个文件写入线程?顺序写作会提高磁盘性能,是吗?如果缓冲整个站点是不可行的,那么你可以在每个站点上收集足够的缓冲区实例,以便在写入线程排队并开始写入集合之前,让磁盘写入值得一段时间(我不知道什么时候收集的总数超过了64K)收集一组新的缓冲区。

最简单的方法,以提高多文件的写入延迟 - 得到一个SSD。

1

我不会有正在运行的线程的“吨”。我会在特定系统上使用不同数量的线程进行配置,直到找到提供最大吞吐量的读取器线程数。我怀疑这个数字会很小。基本上,您只是希望在等待其他服务器响应时保持CPU处于繁忙状态。

我不得不为你写的每个物理驱动器的一个作家线程。使用BlockingQueue将读取线程连接到写入器线程,其大小有限;如果读者在磁盘之前获得太多,这将会限制他们的活动。

0

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