首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用多异步或缓冲IO流?

如何使用多异步或缓冲IO流?
EN

Stack Overflow用户
提问于 2018-06-22 06:51:15
回答 2查看 364关注 0票数 2

我目前正在编写一个将大量数据(~100 to )写入..txt文件的程序。我在googled上搜索了一些关于如何优化不同IO流的内容,但并没有真正理解以下内容:

  1. 如何同时打开多个流
  2. 如果流在默认情况下被缓冲,或者如果我必须对我们进行缓冲,BufferedStream
  3. 异步流和缓冲流的区别是什么?

下面是输出的当前状态:

代码语言:javascript
复制
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
  • 关闭和冲洗溪流

如果我是正确的,那将是大量的开放,关闭和冲洗100兆b的数据。我很想在开始的时候打开多个流,在计算的时候写所有的数据,然后关闭和刷新流。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-22 07:22:25

你的问题有很多

一些非特定顺序的随机点

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

再往前走。

由于缓冲由流负责,您不需要担心它,它会在需要时刷新它(根据默认设置或设置缓冲区的方式)。您不需要关闭文件才能使其刷新。再一次,让溪流来照顾它,或者如果你喜欢的话,你可以用“冲水”来冲洗它。

对于现代的SSD驱动器来说,100 in不是很多,它可以在毫秒内完成。再一次,如果你不需要的话,就没有必要打开和关闭它。但是,如果说打开和关闭一个文件的开销很小,那么在using语句中包装访问并在平静的基础上进行读写有时是有益的。

最后,您可以打开多个流,但它们并不是线程安全的。也就是说,由于它们只有一个内部缓冲区,所以您必须使用锁,或者打开和关闭文件以确保其完整性。这并不是说多个线程不能写入一个文件,而是说它并不像它应该的那样琐碎。

如果要保持文件打开以同步读写,请不要忘记在完成后关闭/释放它们。

祝好运

票数 3
EN

Stack Overflow用户

发布于 2018-06-25 07:54:20

经过进一步的研究,我找到了第一个问题的解决方案。您可以像这样打开多个IO流:

代码语言:javascript
复制
StreamWriter file1 = File.CreateText(@"C:\Outputtests\OutputTest1.txt");
StreamWriter file2 = File.CreateText(@"C:\Outputtests\OutputTest2.txt");

就像这样,你需要自己冲洗和关闭溪流。

我比较了运行时间,它为我的硬盘节省了大约10000倍:

代码语言:javascript
复制
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();
}

不确定你应该在中存储多少,直到你必须冲洗它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50982229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档