2017-11-29 31 views
0

大きなビデオファイル(250MB)をブラウザにロードしようとしています。ファイルが大きいので、一度に特定のバイト数を読み込もうとしていますが、結果がなくてもbufferSizeを変更しようとすると問題がどこかにあるようです。Stream.CopyTo System.OutOfMemoryExceptionをスローするC#

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

例外がCopyToメソッドでスローされます。

ありがとうございます。

+0

一度に読み込むバイト数は関係ありません。最後に、すべてをメモリにロードする必要があります。 – Sefe

+0

ファイルをMemoryStreamにまったくコピーする必要がありますか?後であなたのコードで 'ms'を使っているところで' fs'を使うことができますか? –

+0

なぜMemoryStreamが必要なのですか?ビデオの再生はどうですか? – CSharpie

答えて

0

私は貴重な教訓を学びました。大きなファイルをロードしようとすると、アプリケーションプラットフォームのターゲットを32ビットではなく64ビットに設定します。また、ツール>オプション>プロジェクトとソリューション> WebプロジェクトでVisual Studioが起動するIIS Expressについても同じ操作を行います。これは私の問題を解決しました。多分それは他の人を助けるでしょう。皆さんのコメントに感謝します!

+0

ファイルが2GBより大きい場合、これは失敗する可能性があります。ランタイムでは、オブジェクト(通常はバイト配列)が2GB、リファレンスソース(https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/io/memorystream.cs)は、MemoryStreamがデータを複数の部分に分割して別々のアレイ。 – phi1010

3

Steam.CopyToは、必要に応じてデータをコピーできるようにストリームをリンクせず、すべてのデータをただちにコピーします。

メモリストリームは、一時的なコピーバッファが小さい場合でも、メモリ内のすべてのデータを永続的に保持することを目的としています。

ファイルストリーム自体を使用しようとすると、パフォーマンス上の問題が発生した場合、BufferedStreamが役立ちます。ファイルの一部だけがメモリに保持されます。

関連する問題