【发布时间】: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);
}
}
这个实现有两个问题。
- 我有我的 *.bin 文件和一个 *.zip(只需要 zip)
- 我不知道为什么,但这会占用大量 RAM(对于 15x1.5MB 的 bin 文件大约需要 100MB)
有没有办法完全绕过记忆?
更新:
我想要实现的是生成一个 ZIP 文件,其中包含从数据库 blob 生成的单个二进制文件。这应该发生在 ASP.NET Web API 控制器中。用户可以请求数据,但不是在 HTTP 响应中发送整个数据,而是在请求时生成 ZIP 文件,将其保存到本地文件服务器并将下载链接发送回用户。
【问题讨论】:
-
不清楚您想要实现什么 - 如果您不想使用
...bin创建文件,为什么要创建一个新的FileStream来明确创建该文件? -
通过使用 ILSPY 检查您的调用,有助于检查 CLR 实际在做什么。但对我来说,你也不清楚你想达到什么目的
-
@JonSkeet 我需要一个包含单个 bin 文件的 zip 文件。也许(我希望)有一个更优雅的解决方案,例如为每个数据库结果创建单个 ZipEntriey 对象。我需要在不消耗内存的情况下做到这一点。所以在文件系统上创建文件似乎是一个好的开始。否则我必须将它们保存在内存中。还是我错了?
-
好吧,让我感到困惑的是,为什么您对
.bin文件的存在感到惊讶,当您创建它们时...您当然可以在之后删除它们... -
Zip 归档器在工作期间会消耗大量内存。
标签: c#