流复制时抛出System.OutOfMemoryException异常 C#

5

我正在尝试将一个大视频文件(250mb)加载到浏览器中。由于文件过大,因此我正在尝试一次只加载一定数量的字节,但似乎问题并不在这里,因为我已经尝试更改缓冲区大小,但没有任何结果。

    MemoryStream ms = new MemoryStream();
    using (FileStream fs = File.Open(Server.MapPath(path), FileMode.Open))
    {
        fs.CopyTo(ms, 10000);
    }

异常是在CopyTo方法中抛出的。
提前感谢。

无论一次加载多少字节,最终你仍然需要将所有内容加载到内存中。 - Sefe
你是否需要将文件复制到MemoryStream中?在代码后面使用ms时,你能否只使用fs - Scott Chamberlain
你为什么需要MemoryStream,你是如何播放视频的呢? - CSharpie
在此之前,我只是将视频的src设置为变量"path"。通过这段代码,我试图一次加载视频的小部分以便于播放,因为我认为它一次性尝试加载太多了。 - RJS
你的最终目标是什么?你想要获取这个视频并做什么?将它存储在磁盘上?流式播放?现在,你只是将它存储在内存中,这可能会导致内存不足的问题。 - Vikhram
2个回答

4

Steam.CopyTo不会将流链接起来以便按需复制数据,而是立即复制所有数据。

内存流旨在永久保存所有数据在内存中,但对于大文件,这并不总是一个好主意 -- 即使临时复制缓冲区很小。

您可以尝试使用文件流本身,或者如果这会导致性能问题,则 BufferedStream 可能会帮助您 -- 只会在内存中保留文件的部分内容。


1

所以,我学到了一课。当尝试加载更大的文件时,将应用程序平台目标设置为64位而不是32位。同样,在Tools>Options>Project and Solutions>Web Projects中,对于Visual Studio启动的IIS Express也要做出相同的设置。这解决了我的问题,也许能帮助其他人。感谢大家的评论!


当文件大于2GB时,这可能会失败——运行时不允许对象(通常是字节数组)大于2GB,并且参考源(https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/io/memorystream.cs)似乎不会将MemoryStream将您的数据拆分成存储在不同数组中的多个部分。 - phi1010

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接