4

我目前正在编写一个程序,该程序每秒从(可能很大)数量的源中读取一个短字符串。我需要能够将这些数据写入单独的文件,并且我希望获得有关最有效方法的一些指导。

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

有更好的方法吗?在 C# 中,有没有特别高效的 IO 构造?

编辑:总的来说,我相信“合理”的最大值将是 ~100 个数据源,但在最坏的情况下可能是几百个。

4

1 回答 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

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

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

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

更新

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

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

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

于 2012-10-04T21:33:18.540 回答