0

우리는이 파일을 사용하여 내보낼 파일을 반환합니다. 이 내보내기를 많은 레코드에서 실행하면 실행하는 데 10 분이 걸립니다. 다음은 실제로 File() 메서드를 호출하고 결과를 반환하는 코드의 코드 단편입니다. 실제 ExportFile 방법이 ID에 걸리는ASP.NET MVC FileContentResult SLOW

Public Function Export(ByVal ID As Integer) As FileContentResult 
    Dim str As String = String.Empty 
    Dim data() As Byte 
    Dim r As New ExportResult 
    Dim Test As New TestConnection(WebUtil.UserToken) 

    'This line is important coz IE download was prevented without this. 
    ControllerContext.HttpContext.Response.ClearHeaders() 

    r = Test.ExportFile(ID) 
    data = Encoding.ASCII.GetBytes(r.ResponseString) 

    Return File(data, "text/plain", r.DefaultFileName) 

End Function 

은 데이터베이스의 레코드의 무리를 얻는 다른 방법을 호출하여 각각의 행에 대한 연산의 무리를 행하고, 다음의 StringBuilder를 생성하고, 각 행으로 채워위한 StringBuilder를 호출 한 다음 .ToString()을 수행 한 후 List (Of String)로 팝합니다. 그런 다음이 메서드는 List (Of String)을 ExportFile 메서드에 반환하고이 메서드는 다른 StringBuilder를 만들고 해당 목록의 모든 문자열을 추가 한 다음 하나의 큰 문자열로 변환하고 결과의 ResponseString 속성으로 설정합니다 ('r '위의 코드에서).

이렇게 작동하는 방식입니다. 이 과정을 빨리 처리 할 수있는 방법이 있습니까?

-Scott

편집 : 더 코드

Public Function ExportFile(ByVal ID As Integer) As ExportResult 
      Dim result As New ExportResult 
      Dim s As New StringBuilder 

      'Get all Records 
      Dim dt As New DataTable 
      Using dal As New SQL 
       dal.Parameters.AddWithValue("@ID", ID) 
       dal.Execute("[dbo].[uspGet]", dt) 
       dal.Parameters.Clear() 
      End Using 

      Dim dataobj As New DataObj(dt, ID) 

      'Create FileName 
      If dt.Rows.Count > 0 Then 
       Dim StartDate As DateTime = DateTime.Parse(dt.Rows(0).Item("StartDate")) 
       Dim EndDate As DateTime = DateTime.Parse(dt.Rows(0).Item("EndDate")) 
       result.DefaultFileName = String.Format("HMDA_{0}_{1}.dat", String.Format("{0:MMyyyy}", StartDate), String.Format("{0:MMyyyy}", EndDate)) 
      End If 

      'Add Title Line 
      s.AppendLine(dataobj.CreateTitleLine()) 

      'Add all Record Lines 
      Dim records As List(Of String) = dataobj.CreateRecordLines() 
      Dim last As Integer = records.Count - 1 
      For i = 0 To last 
       If i = last Then 
        s.Append(records(i)) 
       Else 
        s.AppendLine(records(i)) 
       End If 
      Next 

      result.ResponseString = s.ToString 

      Return result 
End Function 

답변

1

당신의 SQL 어떻게 확대됨입니까? 나는 당신의 문제를 점검하기 시작할 것입니다.

그런 다음 파일의 크기를 고려하십시오. 데이터는 여전히 클라이언트에서 다운로드해야합니다.

+0

작업에 사용되는 SQL 쿼리를 실행하면 즉시 실행됩니다. 출력 된 파일의 크기는 1.16MB입니다 (전체 텍스트). 나는 StringBuilder 목록의 엄청난 크기에서 속도가 느려지고, 그 목록이 단일 StringBuilder에 추가 된 다음 .ToString()이 실행될 것이라고 생각합니다. 나는 모든 것을 더 빨리 달릴 수있는 방법을 모른다. – Scott

+0

@Scott, 더 많은 코드를 게시하십시오. 아무도 볼 수없는 것을 최적화 할 수 없습니다. – jfar

+0

방금 ​​ExportFile() 함수의 코드를 게시했습니다. 이것은 실제로 객체를 생성하는 클래스와 함께 작동하고,이 메소드는 먼저 게시 한 메소드에 결과를 반환합니다. – Scott

0

여분의 복사본을 피 하시겠습니까? 바이트로의 변환 및/또는 파일의 생성을 피할 수 있습니다. 이 여분의 작업없이 응답에 문자열을 씁니다.

+0

결과를 포함시키지 말고 그냥 직접 돌려 주시겠습니까? Byte 변환은 FileContentResult가 작동하는 방식 때문에 여전히 발생해야하지만 기술적으로 String 값만 필요합니다. 우리가 결과에 저장 한 주요 이유는 코드 가독성이었습니다. 대폭 도움이 될 것이라고 생각하십니까? – Scott