[英]Download file from one stream and save it to zip in another stream without putting all data in memory
我是處理流或諸如此類的完整的初學者,因此,如果您發現任何明顯錯誤的地方,這就是原因。 我有一些文件存儲在天藍色。 我需要提取文件,將其壓縮,然后返回壓縮文件。
我已經用1GB的文件進行了測試,盡管它可以工作,但最終使用2.5GB的內存。 在最后一行開始和完成之間,內存使用量會激增。 我不確定為什么要在內存中加載所有內容,因此我不確定應該采取什么措施來防止這種情況的發生。 正確的方法是什么? 我唯一想到的就是在某處指定緩沖區大小,但是我見過的所有可能的地方都有一個很小的默認值。
FileStream zipToOpen = new FileStream("test.zip", FileMode.Create);
ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update, true);
ZipArchiveEntry zipEntry = archive.CreateEntry("entryName", CompressionLevel.Optimal);
// ... some azure code
file = await dir.GetFileReference(fileName);
fileContents = await file.OpenReadAsync().ConfigureAwait(false);
await fileContents.CopyToAsync(zipEntry.Open()).ConfigureAwait(false);
只需將存檔創建為
ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create);
您的內存消耗將降至最低(在我的測試案例中,它從900M降至36M)...
似乎問題與ZipArchiveMode.Update有關
void Zip(IEnumerable<string> files, Stream inputStream)
{
using (var zip = new System.IO.Compression.ZipArchive(inputStream, System.IO.Compression.ZipArchiveMode.Create))
{
foreach (var file in files.Select(f => new FileInfo(f)))
{
var entry = zip.CreateEntry(file.Name, System.IO.Compression.CompressionLevel.Fastest);
using (var s = entry.Open())
{
using (var f = File.Open(file.FullName, FileMode.Open, FileAccess.Read, FileShare.Read))
{
f.CopyTo(s);
}
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.