약 20 개 이상의 열이 2 백만 개가 넘는 테이블이있는 데이터베이스가 있습니다. 사용자는 데이터베이스를 쿼리하고 반환되는 레코드 수를 제한하여 레코드 세트가 1 ~ 2 백만 개가 될 수 있습니다.알 수없는 크기의 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에 쓸 수 있으며 memorystream을 건너 뛸 수 있습니다. – dwilliss
링크 된 예제에서 PushStreamContent를 사용할 수 있습니다. MemoryStream을 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