2011-11-30 6 views
0

누군가 파이썬 멀티 스레딩의 가능한 방법은 무엇입니까? 하나의 XML 파일 (163MB)이 ​​있습니다. 내 작업은 이미이 Python 멀티 쓰레딩을 사용하여 XMl에서 DB에 삽입하는 방법은 무엇입니까?

로그 파일에

  • 기록 삽입 된 행의 수를 (많은 테이블)
  • DB를에 데이터를 삽입하는 XML 파일을 읽어

    1. 에 필요 위의 1,2 단계를 수행하는 xml 파일을 읽는 파이썬 코드. 사실, 멀티 스레드를 사용하여 프로세스 속도를 높이고 싶습니다. 나는 일을 시작하는 방법을 모른다.

      다음은 XML 구조입니다.

      <Content id="359366"> 
          <Title>This title</Title> 
          <SortTitle>sorting</SortTitle> 
          <PublisherEntity id="2003">ABC Publishing Group</PublisherEntity> 
          <Publisher>ABC Publishing Group</Publisher> 
          <Imprint>Revell</Imprint> 
          <Language code = "en">English</Language> 
          <GeoRight> 
           <GeoCountry code = "WW" model = "Distribution">World</GeoCountry> 
           </GeoRight> 
          <Format type = "Adobe EPUB eBook"> 
           <Identifier type = "DRMID">xxx-xxx-xx</Identifier> 
           <Identifier type = "ISBN">1234567</Identifier> 
           <SRP currency = "SGD">18.89</SRP> 
           <WholesaleCost currency = "SGD">11.14</WholesaleCost> 
           <OnSaleDate>01 Sep 2010</OnSaleDate> 
           <MinimumSoftwareVersion number="1.x">Adobe Digital Editions</MinimumSoftwareVersion> 
           <DownloadFileName>HouseonMalcolmStreet9781441213877</DownloadFileName> 
           <SecurityLevel value="ACS4">Adobe Content Server 4</SecurityLevel> 
           <ContentFileSize>473923</ContentFileSize> 
           <DownloadUrl>http://xxx.xx.com/</DownloadUrl> 
           <DownloadIDType>CRID</DownloadIDType> 
           <DrmInfo> 
            <Copy> 
             <Enabled>1</Enabled> 
             <Selections>2</Selections> 
             <Interval type = "Days">7</Interval> 
            </Copy> 
            <Print> 
             <Enabled>1</Enabled> 
             <Selections>20</Selections> 
             <Interval type = "Days">7</Interval> 
            </Print> 
            <Lend> 
             <Enabled>0</Enabled> 
            </Lend> 
            <ReadAloud> 
             <Enabled>0</Enabled> 
            </ReadAloud> 
            <Expires> 
             <Enabled>0</Enabled> 
             <Interval type = "Days">-1</Interval> 
            </Expires> 
           </DrmInfo> 
           </Format> 
          <Creator rank="1" id="923710"> 
           <Name>name</Name> 
           <FileAs>Kelly, Leisha</FileAs> 
           <Role id="aut">Author</Role> 
          </Creator> 
          <SubTitle>A Novel</SubTitle> 
          <Edition></Edition> 
          <Series></Series> 
          <Coverage></Coverage> 
          <AgeGroup></AgeGroup> 
          <ContentType></ContentType> 
          <PublicationDate>09/01/2010</PublicationDate> 
          <ShortDescription>description</ShortDescription> 
          <FullDescription>full desc</FullDescription> 
          <Image type = "Cover Image">http://xxx.xx.jpg</Image> 
          <Image type = "Thumbnail Image">http://xxx.xx.jpg</Image> 
          <Subject code="FIC000000">Fiction</Subject> 
          <Subject code="FIC014000">Historical Fiction</Subject>  
      </Content> 
      

      여기에 기존 파이썬 코드 download이 있습니다.

  • +1

    나는 현재 코드를 프로파일 링하고 다른 측면이 얼마나 오랫동안 작용하는지 제안 할 것을 제안합니다. 필자는 멀티 스레딩이 필연적으로 작업 속도를 높일 것이라고 생각하지 않습니다. – MattH

    +0

    감사합니다. xml 구조 및 현재 코드 파일 – hhkhaing

    답변

    0

    음, 이해할 수있는 XML에서 읽기를 분할 할 수는 없지만 XML 구조 및 DB 구조에 따라 데이터베이스에 삽입을 병렬 처리 할 수 ​​있습니다. 불행히도 XML과 DB 구조를 보지 않고 데이터베이스의 제약을 모른 채 (예를 들어 XML 레코드와 auto_increment의 순서를 유지하는 것과 같은) - 특정 상황에서 당신에게 도움이 될 수있는 솔루션에 대해 조언하는 것은 매우 어렵습니다.

    +0

    을 게시했습니다. XML 구조와 현재 코드 파일을 게시했습니다. – hhkhaing

    1

    코드를 살펴 보았습니다. 나는 멀티 스레딩이 당신의 문제에 대한 해답이라고 생각하지 않는다.

    • 은 모든 XML 라이브러리가 동일, lxml는 C로 작성 libxml2에 파이썬 인터페이스, 그리고 내가 사용한 적이 가장 빠른 것입니다.
    • 시간이 많이 걸리는 작업이 있는지 확인하십시오. 파일 조작은 메모리 액세스보다 비쌉니다. 데이터베이스를 호출 할 때마다 비용이 많이 듭니다. 인터넷에서 물건을 다운로드하는 것은 비용이 많이 듭니다.
    • 사용중인 데이터베이스 및 db 인터페이스를 알지 못하지만 은 위생 기능 대신 기본 제공되는 매개 변수화를 사용해야합니다.

    내가 권하고 싶습니다 재 구조화 일괄 처리 방식 사용하도록 코드 :

    • 프로세스는 파이썬 데이터 구조에 필요한 데이터를 추출 전체 XML 파일을.
    • 처리 또는 캐싱의 일부로 파일 시스템에서 별도의 파일을 사용하지 마십시오. 같은 작업의 일부로 나중에 읽으려는 파일에 무언가를 쓰는 것을 피하십시오.
    • 테이블 조회를 미리 캐시합니다. select id from table where name=%s으로 100 회가 아닌 select name,id from table 사전을 만듭니다.
    • 외부 키 테이블 항목을 한 번에 만들 필요가 있는지 확인하고 한 번에 모두 작성하여 id/name 캐시를 업데이트하십시오.
    • 그룹 데이터베이스가 가능한 경우 executeMany 호출로 업데이트됩니다.
    • 더 이상 외래 키로 사용되지 않는 테이블의 행을 정리해야 할 경우 마지막에 단일 SQL 명령을 사용하여 행하십시오.
    관련 문제