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

时间:2012-10-04 21:30:23

标签: c# io

我正在编写一个程序,它每隔几秒就从一个(可能很大)的源中读取一个短字符串。我需要能够将这些数据写入单独的文件中,我希望能够以最有效的方式获得一些指导。

我当前的实现将数据排队,并在队列超过一定大小时刷新数据。

有更好的方法吗?在C#中,是否有任何特别有效的IO结构?

编辑:我认为“合理”最大值将是~100个数据源,但在最坏的情况下可能会达到几百个。

1 个答案:

答案 0 :(得分: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

如果“大”未接近操作系统允许的最大文件句柄数,您可以简单地将文件保持打开状态(如果其他进程在编写时必须访问它们,则根据需要设置共享)。这样可以避免每秒打开一次文件的开销。

确保无论您使用何种缓冲方法,都不会缓冲超出您在停电或其他系统故障时准备丢失的数据。

如果你不能接受数据丢失,你可以立即将每个字符串写入文件(没有任何缓冲),而是使用带有写缓存和备用电池的磁盘控制器。

<强>更新

100个数据源远远低于运行.Net的任何操作系统的最大打开文件数。你应该没问题,只需打开文件并让它们打开,直到你完成它们为止。

有关Windows中句柄数限制的有趣读物,请参阅

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