将2个阵列与每个200,000+值进行比较

时间:2011-08-19 17:54:26

标签: ruby xml performance algorithm

我有200,000多个XML文件的堆栈数据,每周更新/创建一次。因此,每周,我必须解析每个XML文件,检查是否有新的XML文件被创建,然后使用所有更新的数据更新我的数据库。在两者之间,如果有新的XML文件,那么我的数据库将没有该记录,所以我必须创建一个新行。

这是我的工作流程计划:

  1. 将所有表格X行ID放入数组A.假设有200,000个数值。
  2. 解析每个XML文件并收集每个XML的ID(ID将与我的表X ID相同),并存储在数组B中。现在假设我有200,010个数值,与我当前的表X相比有10个新记录
  3. 比较数组A和数组B以查看哪些值不存在。
  4. 将10个新值放入数组C。
  5. 使用数组C中的10个新ID在表X中创建新记录。
  6. 再次解析每个XML文件,并将所需的值存储到我的表X row-column。
  7. 所以现在我的桌子X将有200,010条记录,每条记录都会更新,新的10条记录现在也会出现在表格X中。
  8. 我必须这样做的问题是因为我无法获得供应商创建的任何新XML文件的任何信息。他们只给我一堆文件。

    有更好的方法吗?我担心我的系统在比较两个值超过200,000的数组时会崩溃。感谢。

5 个答案:

答案 0 :(得分:2)

不要比较ruby脚本中的文件。使用MD5总和。除非更改XML的内容,否则这应该有效。然后它根本不是相同的XML。

答案 1 :(得分:2)

我必须做类似的事情。最后我这样做了:

  1. 通过迭代所有XML文件中的每条记录,对项目进行规范化(删除换行符,清理空格,替换某些字符),然后执行每条记录的MD5总和,从而对整个设置进行基线化。同时导入记录。

  2. 当我获得新数据时,我会遍历记录(SAX将是一个好主意),如果记录尚未在数据库中(基于UID)或已更改(基于MD5总和)它得到进口。

  3. 这非常适合我们通常需要它(大约350k记录传播到大约100个文件),但也可以使用(更多)更多数据。它是几种工具的混合体,包括Bash,AWK,sed,grep,精彩的XMLStarlet和Ruby,并且需要适当的重写。

答案 2 :(得分:0)

一些建议:

  1. 如果XML文件很大,请使用SAX Parser进行解析(您不需要将整个文件保留在内存中)。
  2. 对数组A进行排序,以便您可以使用二进制搜索。
  3. 迭代读取每个XML文件,如果文件中的ID不在您的数组A中,则将其存储在表X中(无需保留第二个数组B)。

答案 3 :(得分:0)

看起来是一个非常好的解决方案。稍微改变会使它更快。

在步骤3中,您“比较阵列A和阵列B以查看哪些值不存在。” 我假设您正在迭代数组B(xml),并在数组A(数据库)中查找值。

当你在数组A中找到一个值时,一定要将它从数组A(数据库)中删除,使得数组A在循环时越来越小。

答案 4 :(得分:0)

假设您忽略具有现有ID的XML文件,而不是导入其中的任何更改(您的问题意味着现有文件不会更改,或者您不关心更改),稍微修改您的过程将最佳:

  1. 将数据库中的所有现有ID加载到set,而不是数组。
  2. 解析每个XML文件,提取其ID,并检查它是否在集合中。
  3. 如果文件不在集合中,请对其进行处理并将其添加到数据库中。
  4. 您无需对数据进行两次传递,因为您可以检查文件是否已经处理过,如果没有,则立即处理。