C# 将大文件添加到IO.Compression.ZipArchiveEntry会引发OutOfMemoryException异常

C# 将大文件添加到IO.Compression.ZipArchiveEntry会引发OutOfMemoryException异常,c#,out-of-memory,zipfile,C#,Out Of Memory,Zipfile,我正在尝试使用以下代码向ArchiveEntry添加一个大视频文件(~500MB): using (var zipFile = ZipFile.Open(outputZipFile, ZipArchiveMode.Update)) { var zipEntry = zipFile.CreateEntry("largeVideoFile.avi"); using (var writer = new BinaryWriter(zipEntry.Open())) {

我正在尝试使用以下代码向ArchiveEntry添加一个大视频文件(~500MB):

using (var zipFile = ZipFile.Open(outputZipFile, ZipArchiveMode.Update))
{
    var zipEntry = zipFile.CreateEntry("largeVideoFile.avi");
    using (var writer = new BinaryWriter(zipEntry.Open()))
    {
        using (FileStream fs = File.Open(@"largeVideoFile.avi", FileMode.Open))
        {
            var buffer = new byte[16 * 1024];
            using (var data = new BinaryReader(fs))
            {
                int read;
                while ((read = data.Read(buffer, 0, buffer.Length)) > 0)
                {
                    writer.Write(buffer, 0, read);
                }
            }
        }
    }
}
我发现了错误

System.OutOfMemoryException

调用writer.Write时,我使用了一个中间缓冲区


知道如何解决这个问题吗?

将应用程序构建为任何CPU,并在x64机器上执行。这应该可以解决这个问题。(或直接将应用程序构建为x64)


视频通常无法进行大量压缩,zip文件可能会保留在内存中,直到完全创建压缩文件。

您可以通过删除读写器和使用stream.copyto来简化代码。怀疑它能解决问题。看看
AddEntry(name,stream)
(在调用
Save
之前不要关闭流)和
AddFile(name,nameinfiresystem)
@code混沌:你的意思是使用
zipFile.CreateEntryFromFile
->仍然不起作用。我接受了将CPU体系结构更改为X64的答案,但当指定了
ZipArchiveMode.Update
时,ZipArchiveEntry的低效性值得指出(这会导致将zip的全部内容加载到内存中),是否有类似于关于浮点的压缩页面?压缩任何东西都会使它变小,即使你正在压缩已经压缩的东西,这种想法似乎变得越来越流行!我接受这一点作为答案,似乎现在起作用了。尽管我将指出IO.Compression.ArchiveEntry类的低效性,它需要在指定“ZipArchiveMode.Update”时加载内存中的所有ZipArchive内容。(可怕的)来自msdn:整个存档的内容保存在内存中,在处置存档之前,不会将任何数据写入底层文件或流。这可能是因为压缩是在所有数据都可用时完成的,以提高压缩效率。记住删除临时缓冲区!