【问题标题】:.net 4.5 ZipArchive - Memory leak in my software or in the library?.net 4.5 ZipArchive - 我的软件或库中的内存泄漏?
【发布时间】:2017-02-10 18:19:22
【问题描述】:

我正在使用 C# 构建一个不错的软件。目标版本:.net 4.5。其中一项核心工作是构建文件列表(包含在根文件夹内的各种目录和子目录中),然后一次压缩一个。

我正在使用 System.IO.Compression 中包含的 ZipArchive 类;

代码如下:

 // STEP 1

            using (var fs = new FileStream(destination_path + "\\" + zipname + ".zip", FileMode.OpenOrCreate))
            {

                 using (var zip = new ZipArchive(fs, ZipArchiveMode.Update))
                 {                   

                     // Some non important thing

                     foreach (string single_file in list_file_tobackup)
                     {
                         // non important things

                         zip.CreateEntryFromFile(single_file, temp);

                     }
                 }

             }    
 // STEP 2

这是我在 SO 上找到的一小段代码。重要的是要说(也许)此代码包含在静态类中包含的方法中,并从 WPF 窗口调用。此代码中使用的所有列表都是在静态类本身中声明的静态私有列表,因此它们将保留在内存中。

有什么问题?

当软件在开始时(第 1 步),它对 RAM 的内存影响非常小(就像所有普通的小软件一样)。在所有文件被压缩并最终到达结尾(第 2 步)之后,该软件占用了一大堆内存并且永远不会释放它。

如果我尝试压缩一个非常大的文件夹(大约 400 MB),软件会占用并保留(即使方法完成后)将近 1GB 的 RAM!如果我尝试一些更大的文件夹,它只会崩溃(System.OutOfMemoryException)。

只有在我用一个小文件夹再次运行该方法时,该软件才能释放内存。

起初我认为内存泄漏是由内存中维护的大文件列表引起的。然后我使用了 Visual Studio 内存测试工具,我发现所有那一大块内存都属于 ZipArchive 类,所以我无法更深入地调试。

我做错了什么,或者只是 ZipAchive 库不足以完成我必须做的事情?

如果是最后一个:是否存在一些更好的 .zip 库,可以免费使用而没有太多的许可限制?

【问题讨论】:

  • Zip 更新方法将保留可能导致内存泄漏的新旧文件。

标签: c# .net wpf memory-leaks


【解决方案1】:

From MSDN 当您将模式设置为更新时,底层文件或流必须支持读取、写入和查找。整个存档的内容都保存在内存中,在处理存档之前,不会将任何数据写入底层文件或流。

您是否尝试过使用 ZipArchiveMode.Create?

如果您需要对现有存档执行更新,您仍然可以通过复制现有存档并创建新条目来使用创建。

【讨论】:

  • 使用 ZipArchiveMode.Create 有效!所有文件都添加没有问题。不幸的是,现在软件完全坏了:我的问题中的 sn-p 在 foreach 循环中,所以我第二次运行它时,它只会覆盖以前的 zip ......我不明白最后一句话,你能更好地解释它?我怎样才能做更多的 ZipArchiveMode.Create 实例来“更新”最后只有一个包含我所有内容的 .zip 文件的 zip 文件?我认为这是不可能的......
  • 根据您的用例,每次都创建一个新存档并简单地覆盖以前的存档是一种选择,也是最简单的一种。如果您尝试压缩包含大量文件的非常大的目录,我会尝试创建第二个存档文件(基本上是副本)并尝试复制 zip 条目(如果文件没有更改并添加新条目)。但是,这需要您执行差异等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
  • 2011-03-22
  • 2012-05-29
  • 2012-02-19
  • 1970-01-01
相关资源
最近更新 更多