2009-09-12 2 views
0

조언이 필요합니다. 텍스트 파일에서 이름이 & 인 10,000 개의 행을 동기화 된 큐에 추가되는 XElements로 가져 오는 응용 프로그램이 있습니다. 가져 오기가 완료되면 응용 프로그램은 XElements를 deenqueuing하고, 데이터베이스 호출을 작성하고, 데이터베이스 출력을 요청 문서에 삽입하고, 처리 된 문서를 출력 대기열에 삽입하여 XElements를 처리하는 작업자 스레드를 생성합니다. 모든 요청이 처리되면 출력 대기열이 XML 문서로 디스크에 기록됩니다.XElement vs Dictionary

처리 중에 요청에 필드를 추가해야하므로 XElements를 요청에 사용했습니다. 즉, 작업 유형에 따라 앱에서 공개 레코드 데이터베이스와의 이름/주소 일치를 기반으로 전화 번호, 생년월일 또는 이메일 주소를 요청에 추가하도록 요구할 수 있습니다.

내 질문은; XElements는 많은 양의 메모리를 사용하는 것으로 보이며 문서가 처리 방법을 통해 파싱되므로 많은 파싱이 있음을 알고 있습니다. 나는 XElements를 Dictionary 객체로 대체 할 것을 고려 중이다.하지만 나는 회의적인 입장이다. 본질적으로 그것은 같은 것을 성취 할 것입니다.

생각하십니까?

답변

1

그래서 실제로 XML을 사용하지 않고 있습니까? 이름/값 쌍의 모음으로 XElement을 사용하고 계신지요? 그렇다면 사전을 확실히 사용하고 있습니다. 당신의 코드가 잠재적으로 더 깨끗해지기를 기대합니다.

진정으로 XML을 사용한다면 XElement을 사용하고 싶을 것입니다.

실제로 문제가 있습니까?? 당신은 꽤 많은 메모리를 사용하고 있다고 말합니다 - 만큼 메모리가 있습니까? 메모리가 있습니까? 더 많은 메모리를 살 수 있을까요? 그것은 메모리를 절약하기 위해서라면 리팩토링을 몇 시간 사용하는 것보다 거의 확실히 저렴할 것입니다. (이 응용 프로그램은 하나의 상자에서만 실행되는 것처럼 들리지만 문제가 될 수 있습니다. 배포가 넓어 질수록이를 최적화하는 데 다소 시간을 할애해야 할 것입니다.)

EDIT : 좋습니다. 기억은 실제로 실행 가능하지 않습니다. 그럼에도 불구하고 실제로 문제가 있습니까? 이 메모리가 아마도 필요한 것보다 많은 메모리를 사용하면 어떤 영향이 있을까요? 무엇입니까 정말 비용이 들지 않습니까?

+0

내가 쓰기까지 정말 XML을 사용하지 않는를 디스크에의 출력. 이 시점에서 출력 큐의 XElements를 XDocument에 추가하고이를 디스크에 저장합니다. 메모리에 대해서는 전용 서버를 대여합니다.그들은 50 달러의 추가 요금으로 달 당 요금을 부과합니다. 1 년이 넘는 비용을 인수하기 시작하면 실제로 합산됩니다. – user135498

+0

업데이트 : XElement 대신 사전을 사용하도록 코드를 리팩토링했습니다. 구문 분석 문을 피하기 때문에 코드가 훨씬 깔끔합니다. 내 원본 코드가 레코드 당 38ms로 처리되었습니다. 리팩토링 된 코드의 첫 번째 반복은 45ms에서 처리됩니다. Remove() 메서드에 2 건의 호출을 제거하고 처리 시간을 31ms로 줄이기 위해 한 번 더 리팩토링했습니다. – user135498

0

LINQ를 사용하면 트리를 사용하기 전에 전체 트리를 저장하지 않아도됩니다.

각 행에서 쿼리를 작성할 때 최대한 많은 처리를 수행 할 것입니다.

그런 다음 쿼리 결과를 가져 와서 처리 한 다음 결과를 데이터베이스에 저장합니다.

이렇게하면 각 행이 필요할 때만 읽혀 처리되고 저장되므로 메모리 문제가 줄어 듭니다.

당신이 도움이 될 수있는

: http://www.onedotnetway.com/tutorial-reading-a-text-file-using-linq/

는, 쿼리의 결과를 가지고 각각의 고객을 통해 for 루프를하고 기록을 저장합니다

var query = 
     from c in 
      (from line in File.ReadAllLines(filePath) 
      let customerRecord = line.Split(',') 
      select new Customer() 
       { 
        Firstname = customerRecord[0], 
        Lastname = customerRecord[1], 
        PhoneNumber = customerRecord[2], 
        City = customerRecord[3], 
        Country = customerRecord[4] 
       }) 
     where c.Country == "UK" 
     select c;