2016-07-21 3 views
0

나는 많은 테이블 행을 가져 오는 프로세스를 가지고있다. 이 행은 보고서 시트에보고해야합니다. 내가 지금하고있는 일은 너무 많은 행 (600.000 < = x) - 행이 있기 때문에 너무 느립니다. 그것이 당신을 얻는 곳 모두 StringBuilder를 사용하여많은 행을 파일에 효율적으로 작성하기

 private void CreateReportFile() { 
     MyLog.WriteToLog("Creating ReportFile "+newModel.TableName, MyLog.Messages.Info); 
     string dir = Settings.Default.ReportFolder + "\\" + directoryName + " " + DateTime.Now.ToString("dd-MM-yyyy"); 
     Directory.CreateDirectory(dir); 

     try { 
      File.WriteAllText(dir + "\\Report " + newModel.TableName, report); 
     } catch (DirectoryNotFoundException e) { 

      Console.WriteLine(e.Message + "\n" + e.StackTrace); 
     } 
    } 
+0

당신이 할 수있는 한 가지는 많은 문자열 연결을하는 대신'StringBuilder'를 사용하는 것입니다. 작은 변화로 큰 발전을 볼 수 있습니다. – itsme86

답변

1

시작을 참조하십시오

private void ShowNotFoundRows() { 

     report += "NOT FOUND - Rows"; 
     report += "\r\n"; 
     report += "In Current:"; 
     report += "\r\n"; 
     string Columns = "|"; 
     foreach (string header in currentModel.Columns) { 
      Columns += header + "|"; 
     } 
     report += Columns; 
     report += "\r\n"; 
     foreach (string row in newModel.Keys) { 
      report += row + "\r\n"; 
     } 
     report += "\r\n"; 
     report += "In New:"; 
     report += "\r\n"; 
     report += Columns; 
     report += "\r\n"; 
     foreach (string row in currentModel.Keys) { 
      report += row + "\r\n"; 
     } 
} 

이후 : 난 당신에게 내가 뭘하는지의 아이디어를 제공하기 위해 지금 뭘하는지 보여 드리겠습니다 . stringx = stringx + stringy를 사용하여 많은 양의 메모리에 복사합니다. 새 객체를 만들고 그 객체를 새 객체에 복사하기 때문입니다. 나는 당신이 있어야 할 곳에 당신을 데려다 줄 기분이 들었습니다. 대조적으로 Stringbuilder는 메모리를 미리 할당합니다.

그 외에도 데이터를 파티션으로 나눌 수 있고 다중 스레드를 수행 한 다음 끝에 결과를 결합 할 수 있습니다.

+0

감사합니다! 그게 내가 찾고 있던 것. :) – Ams1

2

문자열을 더 효율적으로 추가하는 StringBuilder를 사용하십시오. C#에서는 "+"매번 새로운 문자열을 만듭니다! AppendLine, Append, AppendFormat 등을 사용하고 ToString()을 완료하면 사용합니다.

var report = new StringBuilder(); 
report.AppendLine("NOT FOUND - Rows"); 
report.AppendLine("In Current:"); 
... 

그런 다음

File.WriteAllText(dir + "\\Report " + newModel.TableName, report.ToString()); 
+0

나는 진드기를 털어 놓지 않았다. 하지만 다른 awnser와 함께 awnser 내 문제에 대한 해결책이었다. 그래서 가상의 진드기를 상상해보십시오 : P. 감사! – Ams1

0

의 StringBuilder는 훨씬 더 효율적으로 메모리에 보고서를 구축하는 데 도움이 될 것입니다. 그러나 그 결과는 아직도 전체적으로 기억 속에 남아 있습니다. 이를 피하려면 FileStream을 사용하여 부분 결과 (예 : 한 줄씩)를 쓸 수 있습니다.

관련 문제