2009-11-08 4 views
3

매우 큰 데이터베이스 (수 기가 바이트)의 XML로 덤프하려고합니다. Linq-to-SQL을 사용하여 데이터베이스에서 데이터를 가져와 Linq에서 XML로 XML을 생성합니다. 나는 메모리 사용을 낮게 유지하기 위해 XStreamingElement을 사용하고있다. 그러나 XML을 작성하지 않은 채로 키링을 수행하기 전에 작업은 여전히 ​​사용 가능한 모든 메모리를 할당합니다. 구조는 다음과 같다 : 아무 소용이 ...Linq-to-XML 및 Linq-to-SQL을 사용하여 매우 큰 XML 파일 생성

foo.Save("contracts.xml", SaveOptions.DisableFormatting); 

: 나는 또한으로 저장하려고했습니다

var foo = 
    new XStreamingElement("contracts", 
     <LinqtoSQL which fetches data>.Select(d => 
    new XElement("contract", 
     ... generate attributes etc... 
using (StreamWriter sw = new StreamWriter("contracts.xml")) 
{ 
    using (XmlWriter xw = XmlWriter.Create(sw)) 
    { 
     foo.WriteTo(xw); 
    } 
} 

.

실마리가 있습니까?

+0

SQL로 직렬화하는 것은 어떻습니까? 그것은 크지 만 적어도 순차적으로 읽을 수는 있습니다 ... – Benjol

답변

0

오른쪽, 내 데이터를 10,000 개의 항목 세트로 묶어 XML 파일을 분리하여 작성함으로써 문제를 "해결"했습니다. 다른 데이터 교환 형식을 숙고하고 더 큰 서버를 구입할 것입니다.

누군가가 XStreamingElement을 적절하게 활용하는 방법을 알아 낸 경우 여전히 재미있을 것입니다.

+0

'XStreamingElement'는 문제가 아니라고 생각합니다. 단일 LINQ to SQL 쿼리를 사용하여 SQL Server에서 모든 데이터를 가져 오려고합니까? 그렇다면 LINQ to SQL 쿼리의 결과를 처리하기 위해 메모리를 할당해야합니다. 작은 덩어리로 DB에서 데이터를 가져 오는 것이 좋습니다. 페이징 시스템을 만들려는 경우와 같이'Skip '/'Take'조합을 사용합니다. – MarcinJuraszek

0

물론, 단 한가지 단서가 필요합니다.하지 마십시오. :-)

XML은 많은 양의 데이터를 제대로 처리하지 못하기 때문에 데이터베이스 덤프에 적합한 형식이 아닙니다.

모든 데이터베이스에는 다른 데이터베이스로 읽을 수있는 형식으로 데이터를 내보내는 일종의 "덤프 (dump)"유틸리티가 있습니다. 그렇게하는 것이 좋습니다.

+0

friism이 XML로 덤프하려고하는 유효한 이유가있을 것입니다. – stimms

+0

20 기가의 XML로 끝나는 데이터에 1 기가의 데이터를 덤프 해 버리는 데는 결코 좋은 이유가 없습니다. :-) –

+0

순수한 덤프가 아니며 일부 컬럼 만 포함되어 있으며 약간의 처리가 필요합니다. 이 작업을 수행하는 이유는 SQL Server를 사용하지 않는 다른 사람들이 데이터를 사용할 수 있도록하려는 것이기 때문입니다 (지금은 MySQL로 가져올 것입니다). 나는 당신의 요점을 인정하지만, 그것은 좋은 것입니다. 압축을 사용하면 오버 헤드가 비참하지 않아야합니다. – friism

1

데이터는 얼마나 복잡합니까? 나는 XStreamingElement에 지나치게 익숙하지 않다. 그러나 XmlWriter을 직접 사용해보다 기쁨을 누릴 수 있을지 궁금하다. 특히 루프의 데이터와 비슷하기 때문에 쉽게 사용할 수 있습니다.

그러나이 데이터의 선택으로 xml에 대한 우려가 있습니다. 이것은 요구 사항입니까? 아니면 간단하게 사용할 수있는 형식입니까? 특히 xml의 크기를 편리하게 구문 분석하는 것은 어려울 수 있습니다. XmlReader (XmlWriter보다 올바르게 처리하는 것이 더 어렵습니다)을 사용해야합니다.

은 다른 형식을 사용하면 좋습니다. 몇 가지로 도약하겠습니다 만, 관심이 있다고 언급하지 않는 한 계속 말하지 않을 것입니다.