如何高效地将传入的数据写入磁盘?

4
我正在编写一个程序,它可以从许多来源读取短字符串,频率可能高达每秒钟一次。我需要将这些数据写入单独的文件中,并希望能够了解如何以最高效的方式实现。
我的当前实现是将数据排队,并在队列超过一定大小时刷新数据。
是否有更好的方法?在C#中,有没有特别高效的IO构造?
编辑:当我说“大型”时,我认为“合理”的最大值应该是约100个数据源,但在最坏的情况下可能会有几百个。
1个回答

3
您需要定义“大”的具体含义才能得到最佳答案。您实际上不需要自己的队列。.NET Framework的BufferedStream非常高效。

http://msdn.microsoft.com/en-us/library/3dsccbf4.aspx

http://msdn.microsoft.com/en-us/library/system.io.bufferedstream.write.aspx

如果“large”没有接近操作系统允许的最大文件句柄数,您可以简单地保持文件处于打开状态(如果其他进程需要访问它们而您正在写入它们,则设置共享)。这将避免每秒钟打开每个文件的开销。
无论使用什么缓冲方法,请确保不要缓冲超过在断电或其他系统故障时准备失去的数据量。
如果您不能接受数据丢失,可以立即将每个字符串写入文件(没有任何缓冲),并改用带有写缓存和电池备份的磁盘控制器。
更新
100个数据源远低于运行.Net的任何操作系统的最大打开文件数。您可以打开文件并将其保持打开状态,直到完成为止。
有关Windows上句柄数量限制的有趣阅读请参见

http://blogs.technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx


非常感谢提供这么好的信息!很高兴我不需要重新发明轮子 :) - dckrooney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接