c# - 如何使用多个异步或缓冲 IO 流?

标签 c# iostream

我目前正在开发一个将大量数据(~100mb)写入 .txt 文件的程序。我用谷歌搜索了一下如何优化不同的 IO-Streams,但并没有真正理解以下内容:

  1. 如何一次打开多个流
  2. 如果默认情况下对流进行缓冲或者我必须使用 BufferedStream
  3. 异步流和缓冲流之间的区别是什么

这是我输出的当前状态:

for (int Row = 0; Row < RowCount; Row++)
{                   
    using (System.IO.StreamWriter file =
        new System.IO.StreamWriter(@"C:\Calculations\data1.txt", true))
            {
                file.WriteLine(Time + "\t" + Row + "\t" + Value1[Row]);
            }
    using (System.IO.StreamWriter file =
        new System.IO.StreamWriter(@"C:\Calculations\data2.txt", true))
            {
                file.WriteLine(Time + "\t" + tRow + "\t" + Value2[Row]);
            }
}

我认为这会做什么:

  • 打开 data1.txt 流
  • 写入 data1.txt
  • 关闭并刷新流
  • 打开 data2.txt 流
  • 写入 data2.txt
  • 关闭并刷新流

如果我的说法是正确的,那么对于 100mb 的数据来说,这将需要大量的打开、关闭和刷新操作。我希望在开始时打开多个流,在计算时写入所有数据,然后关闭并刷新流。

最佳答案

你的问题有很多

一些没有特定顺序的随机点

  1. 所有流在 .net 中都有一个内部缓冲区
  2. 不,您不必缓冲它们,但是出于性能原因您可以调整内部缓冲区的大小(这取决于很多因素)
  3. 异步IO是一个非常复杂的话题,从这里开始阅读Asynchronous File I/O

更多。

由于缓冲是由流处理的,因此您无需担心它,它会在需要时刷新它(根据默认值或您设置缓冲区的方式)。您不需要关闭文件来刷新它。再次,让流来处理它,或者如果您愿意,您可以使用“Flush”自行刷新它

100mb 对于现代 SSD 驱动器来说并不是很多,它可以在几毫秒内完成。再次强调,如果不需要,则无需打开和关闭它。然而,话虽如此,打开和关闭文件的开销却很小,因此有时将访问包装在 using 语句中并在和平餐的基础上进行读写是有益的/简单的

最后,是的,您可以打开多个流,但它们不是线程安全的。这意味着,由于它们只有 1 个内部缓冲区,因此您必须使用锁,或者打开和关闭文件以确保其完整性。这并不是说多个线程不能写入文件,只是说它并不那么微不足道。

如果您想让文件保持打开状态以同步读写,请不要忘记在完成后关闭/处置它们

祝你好运

关于c# - 如何使用多个异步或缓冲 IO 流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50982229/

相关文章:

WrapPanel 中的 C# WPF 控件

c# - 使用 JSON 响应从 Java 调用 C# Web 服务

c++ - 将格式化输入提取器与 getline 混合使用会导致 cout 显示粘在一起

c++ - Pstreams - 如何写入标准输入并获取输出?

c# - C# 中的 Rijndael 解密

c# - 如何从 asp.net 页面中的 html textarea 读取文本?

c++ - 如何清除 C++ 中 iostream 对象中的状态位?

c++ - 使用 <iostream> 打印指针

c++ - 无法使用 cin.get() 读取两个字符串

c# - 使用 Linq 对元组列表进行分组、排序