我目前正在编写一个将大量数据(~100 to )写入..txt文件的程序。我在googled上搜索了一些关于如何优化不同IO流的内容,但并没有真正理解以下内容:
下面是输出的当前状态:
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]);
}
}我认为这样做是为了:
如果我是正确的,那将是大量的开放,关闭和冲洗100兆b的数据。我很想在开始的时候打开多个流,在计算的时候写所有的数据,然后关闭和刷新流。
发布于 2018-06-22 07:22:25
你的问题有很多
一些非特定顺序的随机点
再往前走。
由于缓冲由流负责,您不需要担心它,它会在需要时刷新它(根据默认设置或设置缓冲区的方式)。您不需要关闭文件才能使其刷新。再一次,让溪流来照顾它,或者如果你喜欢的话,你可以用“冲水”来冲洗它。
对于现代的SSD驱动器来说,100 in不是很多,它可以在毫秒内完成。再一次,如果你不需要的话,就没有必要打开和关闭它。但是,如果说打开和关闭一个文件的开销很小,那么在using语句中包装访问并在平静的基础上进行读写有时是有益的。
最后,您可以打开多个流,但它们并不是线程安全的。也就是说,由于它们只有一个内部缓冲区,所以您必须使用锁,或者打开和关闭文件以确保其完整性。这并不是说多个线程不能写入一个文件,而是说它并不像它应该的那样琐碎。
如果要保持文件打开以同步读写,请不要忘记在完成后关闭/释放它们。
祝好运
发布于 2018-06-25 07:54:20
经过进一步的研究,我找到了第一个问题的解决方案。您可以像这样打开多个IO流:
StreamWriter file1 = File.CreateText(@"C:\Outputtests\OutputTest1.txt");
StreamWriter file2 = File.CreateText(@"C:\Outputtests\OutputTest2.txt");就像这样,你需要自己冲洗和关闭溪流。
我比较了运行时间,它为我的硬盘节省了大约10000倍:
static void Main(string[] args)
{
Stopwatch sw1 = new Stopwatch();
Stopwatch sw2 = new Stopwatch();
Stopwatch sw3 = new Stopwatch();
sw1.Start(); //first version: opens and closes file each time -> takes around 1 minute total
for (int i = 0; i < 10000; i++)
{
using (System.IO.StreamWriter file1 =
new System.IO.StreamWriter(@"C:\Outputtests\OutputTest1.txt", true))
{
file1.WriteLine(i);
}
}
sw1.Stop();
sw2.Start(); //second version: flushes each time -> takes around 50ms
StreamWriter file2 = File.CreateText(@"C:\Outputtests\OutputTest2.txt");
for (int i = 0; i < 10000; i++)
{
file2.WriteLine(i);
file2.Flush();
}
file2.Close();
sw2.Stop();
sw3.Start(); //third version: flushes at the end -> takes around 10ms
StreamWriter file3 = File.CreateText(@"C:\Outputtests\OutputTest3.txt");
for (int i = 0; i < 10000; i++)
{
file3.WriteLine(i);
}
file3.Flush();
file3.Close();
sw3.Stop();
Console.WriteLine("Output 1:\t" + sw1.ElapsedMilliseconds.ToString() + Environment.NewLine + "Output 2:\t" + sw2.ElapsedMilliseconds.ToString() + Environment.NewLine + "Output 3:\t" + sw3.ElapsedMilliseconds.ToString());
Console.ReadKey();
}不确定你应该在中存储多少,直到你必须冲洗它。
https://stackoverflow.com/questions/50982229
复制相似问题