需要将数G的数据写入硬盘,预想中先写入内存,等到一定大小(如20M)再写入硬盘,效率要高于直接写硬盘,但测试结果却没有证明自己的预期。请各位高手看看是哪里出问题了,多谢。
一次写入,不缓存,大约30秒执行完成FileStream fileStream = new FileStream(path, FileMode.Create);
            BinaryWriter binaryWriter = new BinaryWriter(fileStream);
            for (int i = 0; i <= 100000000; i++)
            {
                binaryWriter.Write("c" + i);
            }
            fileStream.Close();
缓存大约20M再写入,需要37秒左右执行完成 MemoryStream memoryStream = null;
            BinaryWriter binaryWriter = null;            FileStream fileStream = new FileStream(path, FileMode.Create);
            for (int i = 0; i <= 50000000; i++)
            {
                if (memoryStream == null)
                {
                    memoryStream = new MemoryStream();
                    binaryWriter = new BinaryWriter(memoryStream);
                }                binaryWriter.Write("c" + i);                if (i % 2000000 == 0)
                {
                    memoryStream.WriteTo(fileStream);
                    binaryWriter.Close();
                    memoryStream.Close();
                    binaryWriter = null;
                    memoryStream = null;
                }
            }
            fileStream.Close();                binaryWriter.Close();
            }
            if (memoryStream != null)
            {
                memoryStream.Close();
            }            fileStream.Close();

解决方案 »

  1.   

    避免磁盘(如U盘)在拔出时由于还在写文件导致损坏.
    详情可以在我的电脑=>管理=>磁盘管理=>U盘=>右键=>属性
    看到相关内容.
      

  2.   

    .NET中所有Stream都默认是有缓存的,buffer满了才会写入终端,你可以在reflector中查阅一下System.IO.Stream的派生类,基本上都有内置buffer,所以你这样是两个buffer在工作(实际上是3个,自己代码逻辑一个,MemoryStream内置一个,FileStream内置一个),所以没进行一次实际硬盘操作,需要经过3个buffer的重复计算和数据溢出和清空处理。
      

  3.   

    FileStream构造函数里有bufferSize设置,改变这个值修改内部buffer缓冲容量然后测试一下IO读写性能就ok,多重buffer是资源上的浪费。