FileStream.Write在SSD上长时间阻塞

时间:2013-02-08 14:06:40

标签: c# file-io filestream

我正在用2MB块写入~280MB的数据到FileStream。

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

我从硬件设备返回时写入数据,但我发现有时候,在流上调用Write可能需要很长时间才能返回。我在所有写入之间调用flush:

    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

这不是我所期望的

2 个答案:

答案 0 :(得分:2)

我实际上怀疑它可能是你认为应该让它快速。 SSD很可能是罪魁祸首。

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

有关更多信息,请搜索写入放大。

业界知道这一点,因此他们在SATA中开发了一项名为TRIM的功能。然而,我的研究表明,由于一些奇怪的原因,有些批次的Corsair Force 3在固件中禁用了TRIM ......

答案 1 :(得分:1)

您可以随时在异步线程上运行Write,并在写入过程完成时回调吗?