2011-11-30 65 views
0

有人可以请教我什么是可能的方式与Python多线程? 我有一个XML文件(163 MB)。我的任务是需要如何使用python多线程从XMl插入数据库?

  1. 读取XML文件
  2. 将数据插入到一个DB(多表)
  3. 记录在日志文件中

我已经有插入的行数读取执行上述1,2和3步骤的xml文件的python代码。其实,我想用多线程来加速这个过程。我不知道如何开始工作。

这是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> 

这里是现有的Python代码download

+1

我建议你介绍一下你的当前代码,并计算出不同方面所花费的时间。我认为多线程不一定会加快任务速度。 – MattH

+0

谢谢。我发布了xml结构和当前代码文件 – hhkhaing

回答

0

嗯,你不能用XML来分割阅读,但是你可以做什么,可能取决于你的XML结构和DB结构并行插入数据库。不幸的是,没有看到XML和数据库结构,也不知道数据库的约束(例如,保持xml记录的顺序和auto_increment id的顺序) - 很难就某种解决方案给出建议,以便在特定情况下适用于您。

+0

谢谢。我发布了xml结构和当前代码文件 – hhkhaing

1

我看过你的代码。我不认为多线程是解决您的问题的答案。

  • 不是所有的XML库都是平等的,lxml是一个Python接口libxml2,这是写在C和我用最快的。
  • 请考虑,如果您尚未确定哪些操作在时间上比较昂贵。与内存访问相比,文件操作是昂贵的。每次调用数据库都很昂贵。从互联网下载东西非常昂贵。
  • 我不知道你在使用什么数据库和db界面,但你应该使用内置的参数化而不是你的清理功能真的

我建议你重新构建你的代码使用批处理方式:

  • 处理整个XML文件中提取需要转换为Python数据结构的数据。
  • 不要在文件系统中使用单独的文件作为处理或缓存的一部分。尽量避免将某些内容写入您稍后想要作为同一作业一部分阅读的文件中。
  • 预缓存您的表查找,例如创建一个select name,id from table的字典,而不是拨打select id from table where name=%s的100个电话。
  • 确定哪些外键表条目需要一次创建并一次创建,并更新id/name缓存。
  • 将数据库更新到executeMany调用(如果可用)。
  • 如果您需要从不再用作外键的表中整理行,最后使用单个SQL命令来完成。
相关问题