0

私は、ユーザーがサーバーのハードドライブ上の特定のファイルをダウンロードできるようにする単純なVB.NET Webアプリケーションを持っています。ただし、これらのファイルの中には1GBまでの非常に大きなものもあります。ときには、Webアプリケーションがこれらのファイルを送信しようとすると、アプリケーションはクラップアウトし、System.OutOfMemoryExceptionをスローします。いくつかの調査の後で、これはメモリの断片化に起因するか、またはファイル全体に割り当てるための十分な連続メモリがないことがわかりました。メモリの断片化を心配せずにファイルを送信する方法は?

このエラーが発生するのを避ける方法はありますか?私たちのサーバーは、これらの大きなファイルをダウンロードするのに十分な物理メモリを割り当てています。これは単なるメモリ断片化の問題です。参考のため

、ここの場所に現在あるコードです:

Public Function SendFile(ByVal fileName As String, ByVal contentType As String, ByVal fileLocation As String) As ActionResult 
    Dim fileBytes as Byte() = New WebClient().DownloadData(fileLocation) 
    Return File(fileBytes, contentType, fileName) 
End Function 

... fileNameは、ファイルの名前で、contentTypeは、MIMEタイプで、fileLocationは、ディスク上の物理的な場所です。

提案がありますか?

+0

'HttpWebRequest'を介してチャンクでダウンロードしますか? –

答えて

0

これはコメントセクションでは長すぎるため、答えです。しかし、何のコードも入れていません。

おそらく転送サイズを10MBに制限できます。開始バイト、終了バイト、トランザクションID(そうすることを選択した場合など)など、転送されるデータの最初の数バイトを控除します。

サーバーはファイルを分析し、 Z =(10MB - 専用スペース)チャンクでファイルを送信するのに必要なトランザクションの数。 これは、位置x(0)からy(Z-1)までファイルを読み込み、それらの位置を専用スペースに報告し、チャンクをクライアントに送り、xを= y + 1に進めてループを再開させます。

クライアントは、ディスク上に空白のファイルを作成し、サーバーからファイルを要求し、チャックを受け取り、専用スペースに含まれる位置でファイルディスクに書き込みます。

関連する問題