Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从一个流下载文件并将其保存到另一个流中的zip,而无需将所有数据放入内存_C#_.net_Azure - Fatal编程技术网

C# 从一个流下载文件并将其保存到另一个流中的zip,而无需将所有数据放入内存

C# 从一个流下载文件并将其保存到另一个流中的zip,而无需将所有数据放入内存,c#,.net,azure,C#,.net,Azure,我是一个处理流或类似事情的完全初学者,所以如果你看到任何明显的错误。。。这就是为什么。我在azure上存储了一些文件。我需要把这些文件压缩,然后把压缩文件还给你 我已经用1GB的文件测试过了,虽然它可以工作,但最终使用了2.5GB的内存。从最后一行开始到结束,内存使用量会出现峰值。我不知道为什么这会在内存中加载所有内容,所以我不太确定我应该做什么来防止这种情况发生。正确的方法是什么?我唯一能想到的就是在某个地方指定缓冲区大小,但我所看到的任何地方都有一个小的默认值 FileStream zipT

我是一个处理流或类似事情的完全初学者,所以如果你看到任何明显的错误。。。这就是为什么。我在azure上存储了一些文件。我需要把这些文件压缩,然后把压缩文件还给你

我已经用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文件,流输入流)
{
使用(var zip=new System.IO.Compression.ZipArchive(inputStream,System.IO.Compression.ZipArchiveMode.Create))
{
foreach(文件中的var文件。选择(f=>newfileinfo(f)))
{
var entry=zip.CreateEntry(file.Name、System.IO.Compression.CompressionLevel.faster);
使用(var s=entry.Open())
{
使用(var f=File.Open(File.FullName,FileMode.Open,FileAccess.Read,FileShare.Read))
{
f、 抄袭(s);;
}
}
}
}
}
只需创建存档即可

ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create);
您的内存消耗将降至最低(在我的测试用例中,它从900M降至36M)

问题似乎与ZipArchiveMode.Update有关

void Zip(IEnumerable文件,流输入流)
{
使用(var zip=new System.IO.Compression.ZipArchive(inputStream,System.IO.Compression.ZipArchiveMode.Create))
{
foreach(文件中的var文件。选择(f=>newfileinfo(f)))
{
var entry=zip.CreateEntry(file.Name、System.IO.Compression.CompressionLevel.faster);
使用(var s=entry.Open())
{
使用(var f=File.Open(File.FullName,FileMode.Open,FileAccess.Read,FileShare.Read))
{
f、 抄袭(s);;
}
}
}
}
}

NET应用程序的内存使用可能会产生严重误导。这是由于垃圾收集器在可能的情况下不希望在应用程序关闭之前运行。出于测试目的,可以在代码末尾添加一个“GC.Collect()”()。这甚至可能是极少数在代码中保留这样一个调用对发布版本有帮助的情况之一(通常情况下,您不应该在代码中有这样一个调用),etc:我正在查看VisualStudio中的内置诊断工具,以了解内存使用情况(如果这很重要的话)。我看到最后一行开始和结束之间的内存峰值。如果我把GC.collect()放在末尾,除非我有误解,否则内存将已经被占用。GC将分配内存。但它永远不会取消分配内存,除非它也被强制(GC.Collect,OOM的危险)或您关闭应用程序。这尤其适用于您(或您调用的代码)可能使用的任何临时变量。因此,有时候你可能会有非常奇怪的尖峰,当没有太多的内存被实际使用时——只是很多超出范围的东西没有被清理。最糟糕的例子是在循环中执行propably string CONNECTION(问题太大了,这个操作有一个额外的类)。那么,我如何看到它实际使用了多少内存呢?这最终将成为一个Web服务,我需要确保一个拥有巨大文件的用户不会占用所有内存并导致问题。NET应用程序的内存使用可能会产生严重误导。这是由于垃圾收集器在可能的情况下不希望在应用程序关闭之前运行。出于测试目的,可以在代码末尾添加一个“GC.Collect()”()。这甚至可能是极少数在代码中保留这样一个调用对发布版本有帮助的情况之一(通常情况下,您不应该在代码中有这样一个调用),etc:我正在查看VisualStudio中的内置诊断工具,以了解内存使用情况(如果这很重要的话)。我看到最后一行开始和结束之间的内存峰值。如果我把GC.collect()放在末尾,除非我有误解,否则内存将已经被占用。GC将分配内存。但它永远不会取消分配内存,除非它也被强制(GC.Collect,OOM的危险)或您关闭应用程序。这尤其适用于您(或您调用的代码)可能使用的任何临时变量。因此,有时候你可能会有非常奇怪的尖峰,当没有太多的内存被实际使用时——只是很多超出范围的东西没有被清理。最糟糕的例子是在循环中执行propably string CONNECTION(问题太大了,这个操作有一个额外的类)。那么,我如何看到它实际使用了多少内存呢?这最终将成为一个Web服务,我需要确保一个拥有巨大文件的用户不会占用所有内存并导致问题。我有多个文件需要添加到zip,因此我认为我需要更新。不,您可以使用Create添加多个文件。只是不能同时删除和添加。别猜。。。试试看我有多个文件需要添加到zip,所以我想我需要更新。不,你可以使用Create添加多个文件。只是不能同时删除和添加。别猜。。。试试看