我有200,000多个XML文件的堆栈数据,每周更新/创建一次。因此,每周,我必须解析每个XML文件,检查是否有新的XML文件被创建,然后使用所有更新的数据更新我的数据库。在两者之间,如果有新的XML文件,那么我的数据库将没有该记录,所以我必须创建一个新行。
这是我的工作流程计划:
我必须这样做的问题是因为我无法获得供应商创建的任何新XML文件的任何信息。他们只给我一堆文件。
有更好的方法吗?我担心我的系统在比较两个值超过200,000的数组时会崩溃。感谢。
答案 0 :(得分:2)
不要比较ruby脚本中的文件。使用MD5总和。除非更改XML的内容,否则这应该有效。然后它根本不是相同的XML。
答案 1 :(得分:2)
我必须做类似的事情。最后我这样做了:
通过迭代所有XML文件中的每条记录,对项目进行规范化(删除换行符,清理空格,替换某些字符),然后执行每条记录的MD5总和,从而对整个设置进行基线化。同时导入记录。
当我获得新数据时,我会遍历记录(SAX将是一个好主意),如果记录尚未在数据库中(基于UID)或已更改(基于MD5总和)它得到进口。
这非常适合我们通常需要它(大约350k记录传播到大约100个文件),但也可以使用(更多)更多数据。它是几种工具的混合体,包括Bash,AWK,sed,grep,精彩的XMLStarlet和Ruby,并且需要适当的重写。
答案 2 :(得分:0)
一些建议:
答案 3 :(得分:0)
看起来是一个非常好的解决方案。稍微改变会使它更快。
在步骤3中,您“比较阵列A和阵列B以查看哪些值不存在。” 我假设您正在迭代数组B(xml),并在数组A(数据库)中查找值。
当你在数组A中找到一个值时,一定要将它从数组A(数据库)中删除,使得数组A在循环时越来越小。
答案 4 :(得分:0)
假设您忽略具有现有ID的XML文件,而不是导入其中的任何更改(您的问题意味着现有文件不会更改,或者您不关心更改),稍微修改您的过程将最佳:
您无需对数据进行两次传递,因为您可以检查文件是否已经处理过,如果没有,则立即处理。