2015-02-04 2 views
0

SQL Enterprise Manager에서 실행할 때 "메모리 부족"오류가 발생하는 매우 큰 sql 삽입 파일이 있습니다.큰 파일 - 라인 추가 - 메모리 부족

필자가 보았던 충고는 삽입물에 X 행의 모든 ​​"배치"명령을 "일괄 처리"로 추가하는 것입니다. 내가 파일 및 모든 50 줄을 읽을 수있는 작은 함수를 작성하는 것을 시도하고있다

는 텍스트 행을 추가

나는 내가 그것을 실행하는 경우도 System.OutOfMemoryException를 던지고 작성한 코드를 "GO".

누구든지이 문제를 해결하기 위해 내 코드를 작성하는 더 좋은 방법을 제안 할 수 있습니까?

이 내가 쓴 것입니다 : 당신은 파일을 메모리에서를 작성 후 메모리에있는 파일을 유지하고있어

public static void AddGo() 
    { 
     int currentline = 0; 

     string FilePath = @"C:\Users\trevo_000\Desktop\fmm89386.sql"; 

     var text = new StringBuilder(); 

     foreach (string s in File.ReadAllLines(FilePath)) 
     { 
      // add the current line 
      text.AppendLine(s); 

      // increase the line counter 
      currentline += 1; 

      if (currentline == 50) 
      { 
       text.AppendLine("GO"); 
       currentline = 0; 
      } 
     } 

     using (var file = new StreamWriter(File.Create(@"C:\Users\trevo_000\Desktop\fmm89386Clean.sql"))) 
     { 
      file.Write(text.ToString()); 
     } 

    } 
+5

'ReadAllLines' 대신'ReadLines'을 사용하고'StringBuilder'를 사용하는 대신 읽고있는 루프와 동일한 루틴으로 작성하십시오. 그렇게하면 한 번에 두 줄 이상을 메모리에 둘 필요가 없습니다. – CodesInChaos

+0

목표는 무엇입니까? 많은 행을 삽입 하시겠습니까? 왜 파일입니까? SqlCommand를 사용할 수 없습니까? 또는 일괄 가져 오기? – DrKoch

+0

또는 충분한 RAM이있는 컴퓨터에서 응용 프로그램의 64 비트 빌드를 사용하고 일회성 스크립트의 메모리 사용을 최적화하는 것이 별 가치가 없다고 판단 할 수 있습니다. – CodesInChaos

답변

3

. 대신 입력 파일을 작업하면서 출력 파일을 작성하십시오. 이런 종류의 물건 :

public static void AddGo() { 
    int currentline = 0; 

    string inputFilePath = @"C:\Users\trevo_000\Desktop\fmm89386.sql"; 
    string outputFilePath = @"C:\Users\trevo_000\Desktop\fmm89386Clean.sql"; 
    using (var outputFileStream=File.CreateText(outputFilePath)) { 
     foreach (string s in File.ReadLines(inputFilePath)) 
     { 
      // add the current line 
      outputFileStream.WriteLine(s); 

      // increase the line counter 
      currentline += 1; 

      if (currentline == 50) 
      { 
       outputFileStream.WriteLine("GO"); 
       currentline = 0; 
      } 
     } 
    } 
} 

참고 아니라 ReadAllLines 이상의 입력 파일에 readlines 메쏘드의 사용은 - 그에 대한 추가 정보를 원하시면 What is the difference between File.ReadLines() and File.ReadAllLines()?를 참조하십시오.