我正在用C#工作,并且在我的程序中,我目前正在启动时打开一个文件流,并以CSV格式大约每秒写入一次数据。我想知道,将这些数据存储在arraylist中并在末尾一次全部写入,还是继续保持打开的文件流并仅每秒写入一次数据,会更有效吗?
答案 0 :(得分:1)
如果内存中的数据量“合理可管理”,则将数据写到底。 p>
如果这是连续的,我想知道id是否可以选择使用NLog之类的东西来编写csv(创建特定的日志格式),因为它可以非常有效地管理写入。如果出现错误,还需要将其设置为引发异常。
答案 1 :(得分:0)
您应该考虑改用BufferedStream。写入流,并根据需要允许框架刷新到文件。只需确保在关闭流之前冲洗流即可。
答案 2 :(得分:0)
从我从操作系统中学到的知识,写入文件比写入内存要昂贵得多。但是,您的流很可能将被缓存。这意味着在后台执行的所有文件写入操作都在内存中进行。在适当的时候,操作系统将异步处理文件的所有实际写入。根据您的应用程序,无需担心这种微优化。
上详细了解为什么大多数语言都采用这种方法答案 3 :(得分:0)
这种情况取决于您的具体情况。如果您每秒写一次数据,那么直接写就不会带来太大影响。
通常,将小块写入FileStream
的性能非常好,因为.NET Framework和OS为您处理缓冲。在缓冲区填满或明确刷新流之前,您不会看到文件本身正在更新。
对于小数据和短周期而言,内存缓冲并不是一个可怕的主意。当然,如果您的程序引发异常或有人在将其写入磁盘之前将其杀死,那么您将丢失所有信息,这可能不是您最喜欢的事情。
如果您担心性能,请使用日志记录线程。通过ConcurrentQueue<>
或类似对象向其发布对象,并使其在单独的线程上进行所有写操作。显然,线程日志记录更为复杂。除非您真的真的真的需要额外的性能,否则我不建议您这样做。
对于快速和肮脏的日志记录,我通常只使用File.AppendAllText()
或File.AppendAllLines()
来推送数据。它需要更长的时间,但是非常可靠。而且我可以在程序仍在运行时读取输出,这通常很有用。