2013-02-08 70 views
0

我正在将2MB块中的〜280MB数据写入FileStream。FileStream.Write在SSD上长时间阻塞

在一台机器上,这在8秒内完成。在我的机器上(具有类似的规格,SSD等),我一直在试图调试为什么需要超过40秒,并且他们正在进行中暂停。

我从硬件设备返回数据时写入数据,但我发现有时在流上调用Write可能需要很长时间才能返回。我打电话给所有的写操作之间冲洗:

Stopwatch stopwatch = Stopwatch.StartNew(); 
    _stream.Write(buffer, 0, buffer.Length);   
    stopwatch.Stop(); 
    Console.WriteLine("_stream.Write() " + stopwatch.ElapsedMilliseconds + "ms");    

    _stream.Flush(); 

输出:

_stream.Write() 2ms 
_stream.Write() 2ms 
_stream.Write() 2ms 
... snip 
_stream.Write() 2ms 
_stream.Write() 2ms 
_stream.Write() 2ms 
_stream.Write() 2ms 
_stream.Write() 23233ms <- not expecting this 
_stream.Write() 2ms 
_stream.Write() 2ms 
_stream.Write() 0ms 
... snip 
_stream.Write() 2ms 
_stream.Write() 2ms 
_stream.Write() 15852ms <- or this 
_stream.Write() 2ms 
_stream.Write() 2ms 
_stream.Write() 2ms 
... snip 
_stream.Write() 2ms 
_stream.Write() 25ms 
_stream.Write() 2ms 
_stream.Write() 2ms 

这不是我所期望的

+0

事件查看器中的任何错误?对我来说似乎是硬件问题。 – MiMo 2013-02-08 14:10:08

+1

我将不得不第二次MiMo的评论。听起来像是一个硬件问题。 – JosephHirn 2013-02-08 14:15:45

+0

完整的文件系统缓存很容易解释这一点。购买更多的RAM。 – 2013-02-08 14:43:21

回答

2

其实我怀疑这也许是你认为应该使之快。 SSD可能是罪魁祸首。

所以这里有什么奇怪的。 SSD如.net有GC。这是因为与HDD不同的SSD不能以与写入信息相同的方式删除信息。写入的最小单位比删除的最小单位小得多。

欲了解更多信息搜索写放大。

业界知道这个,所以他们开发了一个名为TRIM的SATA功能。但是我的研究表明,有一批Corsair Force 3在固件中出于某种奇怪的原因禁用了TRIM ...

+0

我无法更新SSD上的固件,因为它显示为我的X79主板上的SCSI设备。我将它从Marvel 6G SATA端口换成Intel 6G SATA端口,然后显示为AHCI设备。然后我从1.5> 5.02更新了SSD固件,并且长时间停顿已经停止! – Tim 2013-02-11 13:19:19

1

您可以随时在异步线程上运行写入,并且只需在写入过程中执行回调完成?