【问题标题】:Writing to file, memory used steadily increasing写入文件,使用的内存稳步增加
【发布时间】:2016-01-13 20:07:19
【问题描述】:

我有一个需要不断将二进制文件写入文件的应用程序。数据位很小,每个大约 1K。运行它的计算机不是很好,并且运行的是 XP。我遇到的问题是,当我打开日志记录时,计算机完全被淹没了,我看着任务管理器,只看到内存使用量不断上升,直到它崩溃。

一位同事建议我将数据包保存在内存中,直到经过一定时间,然后一次全部写入,而不是单独写入每个数据包 - 尝试过,同样的问题。

这是代码(loggingBufferList<byte[]> 我在间隔过去时存储数据包):

if ((DateTime.Now - lastStoreTime).TotalSeconds > 10)
{
    string fileName = @"C:\Storage\file";
    FileMode fm = File.Exists(fileName) ? FileMode.Append : FileMode.Create;
    using (BinaryWriter w = new BinaryWriter(File.Open(fileName, fm), Encoding.ASCII))
    {
        foreach (byte[] packetData in loggingBuffer)
        {
            w.Write(packetData);
        }
    }
    loggingBuffer.Clear();
    lastStoreTime= DateTime.Now;
}

我应该做些什么不同的事情来完成这个?

【问题讨论】:

  • 在 File.Open 周围使用外部“使用”并明确关闭打开的文件,例如using(FileStream fs = File.Open(etc.etc.)) { using (BinaryWriter w = new BinaryWriter(fs)) {
  • w.Write(packetData); 在此行之后尝试放置w.Flush(); 并查找File.WriteAllBytes(string path, byte[] bytes) 方法

标签: c# .net logging optimization binarywriter


【解决方案1】:

在我看来,当您每 10 秒写入一次时,您可以在其间关闭文件。并清理所有相关的文件写入内容。也许这会解决你的问题。 其次,我建议在您实际写入数据的函数之外创建BinaryWriter。它会让事情变得更清楚。在您当前的代码中,您每次都在检查是否追加数据或创建新文件并写入文件。如果您将在函数之外执行此操作并仅调用一次,那么这也可能会节省内存。所有未经我测试,即:)

【讨论】:

  • @HenkHolterman 这根本不是真的。如果您有一个对象,该对象具有您在循环中调用的方法,则将该对象放入循环本身是没有意义的。您无缘无故地创建了数千个句柄。
  • 我同意保持范围尽可能小@HenkHolterman。再次查看问题中的代码,BinaryWriter 从未清理过,w.disposew = null 对我来说似乎很有用。这不是内存泄漏的原因吗?
  • @HenkHolterman,Raymond 那是糟糕的设计实践。如果这些句柄不需要实例化,请不要实例化它们。无缘无故地创造它们只是为了摧毁它们是没有意义的。只要您销毁它的原因合乎逻辑,就让它尽可能小。您实际上是在用什么都不做的对象填充 RAM,并期望 GC 只是为了清理它们,您没有看到其中的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
相关资源
最近更新 更多