【问题标题】:Generate files and ZIP without memory stream在没有内存流的情况下生成文件和 ZIP
【发布时间】:2016-05-04 13:29:35
【问题描述】:

我正在寻找一种在没有内存流的情况下将文件存储在 zip 文件中的方法。我的目标是最大限度地节省系统内存,而直接磁盘 IO 没问题。 我遍历收集了一些 blob 的数据库结果集。这些是字节数组。

我做了以下事情(System.IO.Compression):

using (var archive = ZipFile.Open("data.zip", ZipArchiveMode.Update))
    {
    foreach (var result in results)
    {
        string fileName = $"{result.Id}.bin";

        using (var fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write))
        {
            // write the blob data from result.Value
            fileStream.Write(result.Value, 0, result.Value.Length);
            fileStream.Close();
        }
        archive.CreateEntryFromFile(fileName, fileName);
    }
}

这个实现有两个问题。

  1. 我有我的 *.bin 文件和一个 *.zip(只需要 zip)
  2. 我不知道为什么,但这会占用大量 RAM(对于 15x1.5MB 的 bin 文件大约需要 100MB)

有没有办法完全绕过记忆?

更新:

我想要实现的是生成一个 ZIP 文件,其中包含从数据库 blob 生成的单个二进制文件。这应该发生在 ASP.NET Web API 控制器中。用户可以请求数据,但不是在 HTTP 响应中发送整个数据,而是在请求时生成 ZIP 文件,将其保存到本地文件服务器并将下载链接发送回用户。

【问题讨论】:

  • 不清楚您想要实现什么 - 如果您不想使用 ...bin 创建文件,为什么要创建一个新的 FileStream 来明确创建该文件?
  • 通过使用 ILSPY 检查您的调用,有助于检查 CLR 实际在做什么。但对我来说,你也不清楚你想达到什么目的
  • @JonSkeet 我需要一个包含单个 bin 文件的 zip 文件。也许(我希望)有一个更优雅的解决方案,例如为每个数据库结果创建单个 ZipEntriey 对象。我需要在不消耗内存的情况下做到这一点。所以在文件系统上创建文件似乎是一个好的开始。否则我必须将它们保存在内存中。还是我错了?
  • 好吧,让我感到困惑的是,为什么您对 .bin 文件的存在感到惊讶,当您创建它们时...您当然可以在之后删除它们...
  • Zip 归档器在工作期间会消耗大量内存。

标签: c#


【解决方案1】:

我认为您的 >100 MB 来自

  1. results 对象应包含至少 15x1.5 MB 的 blob 数据
  2. 在 foreach 范围内打开生成的 data.zip。

最小化工作进程的 RAM 量:

create empty zip-file
do {
 (single BLOB query from DB)
 (write blob to new or overwrite File)
 (open zip file for append)
 (append file to zip)
 (close and dispose **both** file handles / objects )
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-20
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2021-08-06
    相关资源
    最近更新 更多