2011-04-01 5 views
-1

XML 피드를 주식 시세와 함께 구문 분석하고 결과를 데이터베이스에 저장하는 구성 요소를 작성하고 있습니다. 피드는 incrementallly 읽을 수 없다는 점을 제외하고는 상당히 간단합니다. 즉, X 마지막 인용 변경 만 원하거나 X 분보다 새로운 변경 만 지정할 수있는 방법은 없습니다. 진짜 문제는 피드가 어리 석고 공급자가 물건을 고쳐야한다는 것입니다.하지만 그건 옵션이 아닙니다.거대한 XML 피드를 구문 분석 할 때 중복 데이터 처리

피드는 공급자에 대한 100000 개의 마지막 주식 시세를 포함하는 거대한 xml 파일입니다. 약 50-100 개의 견적이 변경되는 동안 매분마다 피드가 폴링됩니다. 나머지는 반복적으로 반복되는 따옴표입니다.

피드의 각 폴링 중에 객체에 대한 모든 인용 부호 (lxml 사용)를 구문 분석합니다. 그런 다음 각 견적 객체에 대해 견적이 데이터베이스에 이미 있는지 확인합니다. 만약 그렇다면, 나는 그것을 버리고, 그렇지 않다면, 나는 그것을 저장한다. 이 절차는 새로운 데이터가 약 0.1 % 밖에 없으므로 매우 낭비입니다. 나머지는 중복됩니다. 조금만 최적화하기 위해 마지막 X 시간에 업데이트 된 견적을 데이터베이스에 한 번 조회하여 조회 테이블을 만듭니다. 따옴표는 (last_update, stock_id) 키의 데이터베이스에서 고유하므로이 최적화는 쿼리 수를 약 50 % 줄입니다.

그러나 각 견적을 개별적으로 검사해야하거나 존재하지 않는 경우 데이터베이스에 과도하게 부담해야하는 50k db 쿼리가 있습니다.

그래서 내가 찾고있는 것은 내 피드 파서를 더 빠르게 만드는 방법에 대한 아이디어입니다. 어쩌면 마지막으로 가져온 XML 파일을 새 파일과 비교하는 방법이 있을까요?

+0

어떤 데이터베이스가 있습니까? – ajreal

답변

1

가장 최근의 항목이 피드 상단 또는 하단에 있습니까? 상단에있는 경우 데이터베이스에 이미있는 첫 번째 항목을 보았을 때 파싱을 중지 할 수 있습니다.

가장 최근의 항목이 마지막으로 오는 경우 견적 키를 캐싱하고 메모리에 올려 놓은 다음 캐시되지 않은 캐시로 이동 한 후 데이터베이스를 시작하기 만하면됩니다. 아니면 당신이 데이터베이스에 넣은 마지막 견적을 기억하고 당신이 그것을 찾는 모든 항목을 구문 분석하고 그것 후에 항목에 대해서만 데이터베이스를 누르십시오.

1

문제는 두 가지 영역으로 나뉩니다. 1) 구문 분석 할 필요가없는 구문 분석을 피하는 방법과 2) 필요하지 않은 데이터베이스 조작을 피하는 방법.

따옴표 자체가 매우 작 으면 아마도 (1)을 풀려고 시도하지 않을 것입니다. 그렇지 않으면 걱정하지 않는 따옴표를 버리고 나머지는 DOM 구문을 완전히 분석하는 필터 (예 : XSLT 또는 SAX 사용)를 만들 수 있습니다.

(2)를 해결하려면 일반적으로 diffing XML 파일이 까다로울 수 있습니다. XML 문서의 공백을 변경하면 일부 공급자에서 흔히 볼 수있는 오류가 오 탐지 될 수 있으며 일반적으로 실제 XML 구조가 아니라 단순한 텍스트 별 라인 별 비교.이것이 당신에게 문제가 될 것이라고 생각하지 않는다면, 탐색 할 수있는 몇 가지 스택 오버 플로우 주제가 있지만, 오픈 소스 영역에서 특히 XML diff가 여전히 털이 많은 영역임을 입증 할 것이라고 생각합니다. Programmatically Diff/Merge Xml Documents

  • Diff two XML doc in Ruby?
  • XML Diff and Merge

  • 이미 업데이트됩니다 물건의 신속한 조회를 위해 로컬 또는 분산 메모리 캐싱을 사용하는 것입니다 일할 수있는 또 다른 방법
    • . 콘텐츠를 시도하거나 필터링하지 않아도되는 이점을 얻을 수 있으며 장기적인 인프라를 구축하는 경우 다른 유스 케이스에 맞게 캐싱 인프라를 쉽게 적응할 수 있습니다. OTOH는 확장 가능한 분산 캐싱 인프라를 만드는 것이 특히 저렴한 솔루션은 아닙니다.