我正在编写一个程序,它每隔几秒就从一个(可能很大)的源中读取一个短字符串。我需要能够将这些数据写入单独的文件中,我希望能够以最有效的方式获得一些指导。
我当前的实现将数据排队,并在队列超过一定大小时刷新数据。
有更好的方法吗?在C#中,是否有任何特别有效的IO结构?
编辑:我认为“合理”最大值将是~100个数据源,但在最坏的情况下可能会达到几百个。
答案 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