我目前正在开发一个将大量数据(~100mb)写入 .txt 文件的程序。我用谷歌搜索了一下如何优化不同的 IO-Streams,但并没有真正理解以下内容:
- 如何一次打开多个流
- 如果默认情况下对流进行缓冲或者我必须使用 BufferedStream
- 异步流和缓冲流之间的区别是什么
这是我输出的当前状态:
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 的数据来说,这将需要大量的打开、关闭和刷新操作。我希望在开始时打开多个流,在计算时写入所有数据,然后关闭并刷新流。
最佳答案
你的问题有很多
一些没有特定顺序的随机点
- 所有流在 .net 中都有一个内部缓冲区
- 不,您不必缓冲它们,但是出于性能原因您可以调整内部缓冲区的大小(这取决于很多因素)
- 异步IO是一个非常复杂的话题,从这里开始阅读Asynchronous File I/O
更多。
由于缓冲是由流处理的,因此您无需担心它,它会在需要时刷新它(根据默认值或您设置缓冲区的方式)。您不需要关闭文件来刷新它。再次,让流来处理它,或者如果您愿意,您可以使用“Flush”自行刷新它
100mb 对于现代 SSD 驱动器来说并不是很多,它可以在几毫秒内完成。再次强调,如果不需要,则无需打开和关闭它。然而,话虽如此,打开和关闭文件的开销却很小,因此有时将访问包装在 using
语句中并在和平餐的基础上进行读写是有益的/简单的
最后,是的,您可以打开多个流,但它们不是线程安全的。这意味着,由于它们只有 1 个内部缓冲区,因此您必须使用锁,或者打开和关闭文件以确保其完整性。这并不是说多个线程不能写入文件,只是说它并不那么微不足道。
如果您想让文件保持打开状态以同步读写,请不要忘记在完成后关闭/处置它们
祝你好运
关于c# - 如何使用多个异步或缓冲 IO 流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50982229/