私は、約20の列のわずか200万レコードを超えるテーブルを持つデータベースを持っています。ユーザーはデータベースにクエリを実行し、返されるレコードの数を制限して、レコードセットが1〜200万になるようにすることができます。未知のサイズのCSVをメモリからストリーミングする正しい方法
表情報であるため、データをCSV形式で送信したいと考えています。私はStreamWriterを使用してデータをメモリに書き出し、ファイルが完成したらHttpResponseMessageとして送信します。私のコードは以下の通りですが、メモリが足りなくても正常に動作します。使用されているメモリが最小限になるようにファイルが処理されているときにファイルをストリーミングする方法はありますか?
<HttpGet, Route("api/records/export")>
Public Function ExportRecords() As HttpResponseMessage
Dim stream As New MemoryStream
Dim writer As New StreamWriter(stream)
writer.WriteLine("")
' Processing of data here
writer.WriteLine("""Write Data to MemoryStream"")
writer.Flush()
stream.Position = 0
Dim result As New HttpResponseMessage(HttpStatusCode.OK)
result.Content = New StreamContent(stream)
result.Content.Headers.ContentType = New Headers.MediaTypeHeaderValue("text/csv")
result.Content.Headers.ContentDisposition = New Headers.ContentDispositionHeaderValue("attachment") _
With {.FileName = "I" & Format(Date.Now, "yyMMdd") & ".csv"}
Return result
End Function
私は、このようなReturning binary file from controller in ASP.NET Web APIような質問にStackOverflowの回答に読んだが、これらのファイルメモリからディスクに格納されていないから、ウェブ応答をストリーミングして、すべての契約。
Response.OutputStreamに書き込み、メモリストリームをスキップできます。 – dwilliss
あなたがリンクした例のPushStreamContentを使うことができます。MemorySteamをPushStreamContentのstreamパラメータで置き換え、 'stream.Position = 0'文を省略するだけです。 (ここではC#を使用してよろしいですか?) 'result.Content = new PushStreamContent((stream、httpContent、transportContext)=> {var writer = new StreamWriter(stream); \ *コード残り* writer.Flush(); stream.Close();})m "text/csv"); ' – ckuri