2009-09-10 2 views
6

타사 공급 업체에서 사용할 시스템에서 내 보낸 데이터를 나타내는 상당히 큰 XML 파일이 여러 개 있습니다. 파일이 거대하고 관리하기 어려운 파일이 되었기 때문에 각 XML 파일에 대해 2,500 개의 레코드로 결과를 잘라 내고있었습니다. 그러나 타사 공급 업체가이 XML 파일을 모두 하나의 파일로 결합하라고 요청했습니다. 이 XML 파일 중 78 개가 크기가 700MB가 넘습니다! Crazy, know ... 그래서 C#을 사용하여 공급 업체를 수용하기 위해이 파일을 결합하는 방법은 무엇입니까? 희망 한 번 나는 당신의 XML이 같이 보입니다 것을 여기에서 사지에 나가서 가정거야C#에서 두 개 이상의 XML 파일을 같은 스키마로 병합하는 가장 효율적인 방법은 무엇입니까?

답변

4

을 LINQ의 :-)를 사용하여 한 번에 모든 파일에서 읽지 않고이 작업을 수행 할 수있는 실제 효율적인 방법이있다 :

<records> 
    <record> 
    <dataPoint1/> 
    <dataPoint2/> 
    </record> 
</records> 

그렇다면 파일 스트림을 열고 <records> 부분을 작성한 다음 각 XML 파일을 순차적으로 열고 모든 행 (첫 번째 및 마지막 행 제외)을 디스크에 씁니다. 그렇게하면 메모리에 엄청난 문자열이 생기지 않으며 코드 작성 및 실행이 매우 빨라야합니다.

public void ConsolidateFiles(List<String> files, string outputFile) 
{ 
    var output = new StreamWriter(File.Open(outputFile, FileMode.Create)); 
    output.WriteLine("<records>"); 
    foreach (var file in files) 
    { 
    var input = new StreamReader(File.Open(file, FileMode.Open)); 
    string line; 
    while (!input.EndOfStream) 
    { 
     line = input.ReadLine(); 
     if (!line.Contains("<records>") && 
      !line.Contains("</records>")) 
     { 
     output.Write(line); 
     } 
    } 
    } 
    output.WriteLine("</records>"); 
} 
+0

이것은 가장 빠른 방법이지만 조금 '해킹'입니다. –

+0

동의 함, 'hacky'at best : p DataSet.Merge는 훨씬 더 우아 해 보이지만 메모리 효율성이 얼마나되는지 전혀 알지 못합니다. – JustLoren

+0

나는 각 XML 파일에 구운 스키마를 가지고 있기 때문에 좀더 'hacky'가된다. –

2
사용 DataSet.ReadXml()

, DataSet.Merge()DataSet.WriteXml(). 프레임 워크가 당신을 위해 일하게하십시오. 이 같은
뭔가 : 추가 설명 및 실시 예를 들어

public void Merge(List<string> xmlFiles, string outputFileName) 
    { 
    DataSet complete = new DataSet(); 

    foreach (string xmlFile in xmlFiles) 
    { 
     XmlTextReader reader = new XmlTextReader(xmlFile); 
     DataSet current = new DataSet(); 
     current.ReadXml(reader); 
     complete.Merge(current); 
    } 

    complete.WriteXml(outputFileName); 
    } 

는 Microsoft에서 this article를보십시오.

+0

이것은 내가 취한 원래 경로입니다. 문제는 프로세스가 RAM을 사용하여 종료되었다는 것입니다. –

관련 문제