【问题标题】:Add files to ZipArchive gives OutOfMemory Exception [duplicate]将文件添加到 ZipArchive 会导致 OutOfMemory 异常 [重复]
【发布时间】:2021-03-04 15:53:07
【问题描述】:

我正在创建一个压缩文件,代码如下

ZipArchive MyZipArchive = System.IO.Compression.ZipFile.Open(@"c:\ZipProject\Test.zip", ZipArchiveMode.Update);

然后我将文件添加到 zip 中,如下所示。 fielList 中大约有 10 个文件,每个文件大小为 250 mb

foreach (string f in fileList)
{ 
     MyZipArchive.CreateEntryFromFile(f,Path.GetFileName(f),CompressionLevel.Fastest );
}

在第一个文件中我得到 OutOfMeomry 异常 是否有将大文件添加到 zip 的方法? 我已经尝试了所有的压缩,但结果是一样的

【问题讨论】:

  • 您使用的是 32 位构建配置吗?如果你使用 x64 会怎样?
  • 我用的是32。32没有选项吗?目前很难升级
  • 我升级到 64 位但不幸的是错误仍然存​​在
  • 32 位可以寻址 10 x 250mb,但是您的进程似乎无法找到可用的 连续 内存。我从不建议这样做,但是如果在添加每个文件之前 GC.Collect() 会怎样?
  • 您可以创建一个只有压缩逻辑的快速项目,并检查您是否在 32 位中重现问题,如果是,将其更改为 x64 将易于测试并缩小问题的原因。无论如何,如果您由于32 bit procceses memory limit 而在内存中拥有整个文件,则不太可能解决。您可以尝试不同的方法,使用流。

标签: c#


【解决方案1】:

使用几个每个只有几 MB 的文件和一个空的 zip 文件来测试您的代码。 如果失败,则问题不在于内存,而在于编程错误。 如果它有效,那么您实际上虚拟内存不足。在这种情况下,您必须切换到 x64 才能寻址超过 4 GB 的内存。那是假设你有足够的物理内存。

【讨论】:

    【解决方案2】:

    我测试了你的例子(下面的完整代码)

    using System;
    using System.IO;
    using System.IO.Compression;
    
    namespace ZipTest
    {
      internal static class Program
      {
        private static void Main()
        {
          var fileList = new[] { @"d:\Test\file1", @"d:\Test\file2", @"d:\Test\file3", @"d:\Test\file4",
            @"d:\Test\file5", @"d:\Test\file6", @"d:\Test\file7", @"d:\Test\file8", @"d:\Test\file9", @"d:\Test\file10" };
          using (var MyZipArchive = ZipFile.Open(@"d:\Test\Test.zip", ZipArchiveMode.Update))
          {
            foreach (var f in fileList)
            {
              Console.WriteLine("Compressing: " + f);
              MyZipArchive.CreateEntryFromFile(f, Path.GetFileName(f), CompressionLevel.Fastest);
            }
          }
        }
      }
    }
    

    文件总大小约为 2 GB,压缩后大小几乎相同(我使用了安装程序,因为我没有找到任何其他大文件)。

    首次运行导致内存不足异常(在最后一个文件之后)。这似乎已导致 Windows 清除 (释放未使用的) 内存,并且没有其他运行导致异常。应用程序的总虚拟内存约为 3.5 GB

    查看 cmets 中的重复项。这可能会对您有所帮助。

    【讨论】:

    • 仅作为说明:更改为ZipArchiveMode.Create 导致,虚拟内存大小小于150 MB;似乎在更新模式下,所有内容都存储在 RAM 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 2014-02-16
    • 1970-01-01
    相关资源
    最近更新 更多