连续写入文件与将数据保存在数组中并一次写入文件

时间:2018-07-02 22:39:58

标签: c# performance

我正在用C#工作,并且在我的程序中,我目前正在启动时打开一个文件流,并以CSV格式大约每秒写入一次数据。我想知道,将这些数据存储在arraylist中并在末尾一次全部写入,还是继续保持打开的文件流并仅每秒写入一次数据,会更有效吗?

4 个答案:

答案 0 :(得分:1)

如果内存中的数据量“合理可管理”,则将数据写到底。

如果这是连续的,我想知道id是否可以选择使用NLog之类的东西来编写csv(创建特定的日志格式),因为它可以非常有效地管理写入。如果出现错误,还需要将其设置为引发异常。

答案 1 :(得分:0)

您应该考虑改用BufferedStream。写入流,并根据需要允许框架刷新到文件。只需确保在关闭流之前冲洗流即可。

答案 2 :(得分:0)

从我从操作系统中学到的知识,写入文件比写入内存要昂贵得多。但是,您的流很可能将被缓存。这意味着在后台执行的所有文件写入操作都在内存中进行。在适当的时候,操作系统将异步处理文件的所有实际写入。根据您的应用程序,无需担心这种微优化。

您可以在https://unix.stackexchange.com/questions/224415/whats-the-philosophy-behind-delaying-writing-data-to-disk

上详细了解为什么大多数语言都采用这种方法

答案 3 :(得分:0)

这种情况取决于您的具体情况。如果您每秒写一次数据,那么直接写就不会带来太大影响。

通常,将小块写入FileStream的性能非常好,因为.NET Framework和OS为您处理缓冲。在缓冲区填满或明确刷新流之前,您不会看到文件本身正在更新。

对于小数据和短周期而言,内存缓冲并不是一个可怕的主意。当然,如果您的程序引发异常或有人在将其写入磁盘之前将其杀死,那么您将丢失所有信息,这可能不是您最喜欢的事情。

如果您担心性能,请使用日志记录线程。通过ConcurrentQueue<>或类似对象向其发布对象,并使其在单独的线程上进行所有写操作。显然,线程日志记录更为复杂。除非您真的真的真的需要额外的性能,否则我不建议您这样做。

对于快速和肮脏的日志记录,我通常只使用File.AppendAllText()File.AppendAllLines()来推送数据。它需要更长的时间,但是非常可靠。而且我可以在程序仍在运行时读取输出,这通常很有用。