尽可能快地处理40M的文档(和索引)

She*_*don 3 xml database parsing

祝你有美好的一天.所以我的问题基本上就是这个,我需要处理37.800.000个文件.

每个"文件"真的不止于此,我所拥有的是:

  • 37.800.000 XML文档.
  • 超过120.000.000的Tiff图像.

每个XML文档都引用一个或多个Tiff图像,并为它所代表的图像提供一组通用关键字.

我需要构建的是一个解析每个XML文件的系统(不仅有我需要的关键字,而且还有很多垃圾).对于每个文件,它需要将索引存储在数据库(作为列)和图像的路径(也在数据库中),路径只是因为我不认为将图像存储在里面也是个好主意.

最终目的是用户可以使用索引关键字搜索数据库,系统会加载与该索引关联的图像.

我已经使用XPath构建了解析器,并且还定义了db的架构(这很简单).但是我遇到了两件事情,这导致我的系统工作非常慢,并且偶尔会抛出SQLExceptions:

我想,为了在处理文件时没有充满pc内存,我需要一种分页代码但是反向,以便将相应的项目发送到db(例如,每1000个文件打包),所以,如何实现这是我的第一个问题.

第二个是XML文件没有连续命名,所以我需要像这样处理重复:当尝试索引和现有的图像或图像时(通过查看它的唯一键名是否也在数据库中),我需要比较那个图像索引日期,用最新的索引图像来查看重复项必须去(系统只关于最新的索引,通过查看索引文件的日期关键字).

任何人都知道如何解决这个问题?我正在使用Java来处理图像搜索门户的解析器和JSP,也使用MySQL.

提前致谢.

这是索引文件之一的结构.

Image文件位于"FileInfo"元素的"dwFileName"属性中.当前索引文档的文件名是"DW5BasketFileName".如果有多个具有相同索引的图像,则除了扩展名之外,还有更多的索引文件等于它(它以001开头并继续计数.

每个文档的平均大小为4KB.

<DWDocument DW5BasketFileName="DOCU0001.001">
  <FileInfos>
    <ImageInfos>
      <ImageInfo id="0,0,0" nPages="0">
        <FileInfo fileName="c:\bandejas\otra5\D0372001.DWTiff" dwFileName="D0001001.DWTiff" signedFileName="D0372001.DWTiff" type="normal" length="66732" />
      </ImageInfo>
    </ImageInfos>
  </FileInfos>
  <FileDatas />
  <Section number="0" startPage="0" dwguid="d3f269ed-e57b-4131-863f-51d147ae51a3">
    <Metadata version="0">
      <SystemProperties>
        <DocID>36919</DocID>
        <DiskNo>1</DiskNo>
        <PageCount>1</PageCount>
        <Flags>2</Flags>
        <StoreUser>DIGITAD1</StoreUser>
        <Offset>0</Offset>
        <ModificationUser>ESCANER1</ModificationUser>
        <StoreDateTime>2009-07-23T21:41:18</StoreDateTime>
        <ModificationDateTime>2009-07-24T14:36:03</ModificationDateTime>
      </SystemProperties>
      <FieldProperties>
        <TextVar length="20" field="NO__REGISTRO" id="0">10186028</TextVar>
        <TextVar length="20" field="IDENTIFICACION" id="1">85091039325</TextVar>
        <TextVar length="40" field="APELLIDOS" id="32">DYMINSKI MORALES</TextVar>
        <TextVar length="40" field="NOMBRES" id="33">JHONATAN OSCAR</TextVar>
        <Date field="FECHA_DEL_REGISTRO" id="64">1985-10-10T00:00:00</Date>
      </FieldProperties>
      <DatabaseProperties />
      <StoreProperties DocumentName="10/10/1985 12:00:00 a.m." />
    </Metadata>
    <Page number="0">
      <Rendition type="original">
        <Content id="0,0,0" pageNumberInFile="0" />
        <Annotation>
          <Layer id="1" z_order="0" dwguid="5c52b1f0-c520-4535-9957-b64aa7834264">
            <LayerLocation x="0" y="0" />
            <CreateUser>ESCANER1</CreateUser>
            <CreateTime>2009-07-24T14:37:28</CreateTime>
            <Entry dwguid="d36f8516-94ce-4454-b835-55c072b8b0c4">
              <DisplayFlags>16</DisplayFlags>
              <CreateUser>ESCANER1</CreateUser>
              <CreateTime>2009-07-24T14:37:29</CreateTime>
              <Rectangle x="6" y="0" width="1602" height="20" flags="0" size="10" color="#ffffff" bkgcolor="#000000" />
            </Entry>
            <Entry dwguid="b2381b9f-fae2-49e7-9bef-4d9cf4f15a3f">
              <DisplayFlags>16</DisplayFlags>
              <CreateUser>ESCANER1</CreateUser>
              <CreateTime>2009-07-24T14:37:31</CreateTime>
              <Rectangle x="1587" y="23" width="21" height="1823" flags="0" size="10" color="#ffffff" bkgcolor="#000000" />
            </Entry>
            <Entry dwguid="9917196d-4384-4052-8193-8379a61be387">
              <DisplayFlags>16</DisplayFlags>
              <CreateUser>ESCANER1</CreateUser>
              <CreateTime>2009-07-24T14:37:33</CreateTime>
              <Rectangle x="0" y="1836" width="1594" height="10" flags="0" size="10" color="#ffffff" bkgcolor="#000000" />
            </Entry>
            <Entry dwguid="3513e0c8-a6c9-42ec-ae9c-dc084376fcdb">
              <DisplayFlags>16</DisplayFlags>
              <CreateUser>ESCANER1</CreateUser>
              <CreateTime>2009-07-24T14:37:35</CreateTime>
              <Rectangle x="0" y="0" width="23" height="1839" flags="0" size="10" color="#ffffff" bkgcolor="#000000" />
            </Entry>
          </Layer>
          <DW4CheckSum dwCheckSum="1479972439" dwDate="131663617" dwTime="319564778" dwImageSize="66732" dwSource="0" source="" />
        </Annotation>
      </Rendition>
    </Page>
  </Section>
</DWDocument>
Run Code Online (Sandbox Code Playgroud)

Vas*_*des 5

我想说,这里的第一个问题来自磁盘访问时间.即使你的xml文件只有1k,那么它们也相当于37GB的数据并且需要时间来阅读.没有什么可以改善这一点.

但是,您可以确保不会浪费额外的时间进行其他不必要的阻塞计算.

  1. 如果数据库也在同一个磁盘中,批量应远远大于1000,您希望在内存允许的情况下访问数据库的次数很少(如果xml文件连续存储在磁盘中)
  2. 确保尽快释放变量,以便垃圾收集器可以释放内存.
  3. 您希望在计算机等待读取文件执行xml解析,因此您应该设置另一个线程来并行执行任务.

至于您的第二个问题,对于每个图像,可以对具有相同索引的图像执行更新sql语句,如果没有更新行,则将此图像插入新行.这是否比使用select后插入/更新更好,取决于您拥有的重复项的百分比.

我正在进行假设并且假设xml文件的创建速度不比处理它们的速度快,如果是这种情况,您需要做的就是将已经处理过的文件名保存到数据库或平面中文件并在下次启动时将其读回,确保您不必重新开始.

  • 关于重复:在MySQL中有一个有用的INSERT ... ON DUPLICATE KEY UPDATE语句(http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html),它处理更新和插入一条指令!刚刚在我的一个StackOverflow问题中发现:http://stackoverflow.com/questions/1492761/performing-an-update-or-insert-depending-whether-a-row-exists-or-not-in-mysql: - ) (2认同)