【问题标题】:Handling duplicate data when parsing huge XML feeds解析大型 XML 提要时处理重复数据
【发布时间】:2011-07-27 12:28:17
【问题描述】:

我正在编写一个组件,它解析带有股票报价的 xml 提要并将结果保存在数据库中。问题相当简单,只是无法增量读取提要。也就是说,没有办法指定您只希望 X 最后报价更改或仅更改比 X 分钟更新,例如。我知道真正的问题是提要很愚蠢,提供者应该修复他们的东西,但这不是 atm 的选项。

Feed 是一个巨大的 xml 文件,其中包含供应商的 100000 条最新股票报价。提要每分钟轮询一次,在此期间大约有 50-100 个更改的报价。其余的是重复的引号,一遍又一遍地阅读。

在每次提要轮询期间,我将所有引号(使用 lxml)解析为对象。然后,对于每个报价对象,我检查数据库中是否已经存在报价。如果是,我丢弃它,如果不是,我保存它。这个过程非常浪费,因为只有大约 0.1% 是新数据,其余的都是重复的。为了稍微优化一下,我通过在数据库中查询一次最近 X 小时内更新的报价来创建一个查找表。引号在 (last_update, stock_id) 键上的数据库中是唯一的,因此这种优化将查询数量减少了大约 50%。

但仍有 50k 数据库查询,其中每个报价必须单独检查是否存在,这对数据库来说非常繁重。

所以我正在寻找关于如何使我的提要解析器更快的想法。也许有一种方法可以将最后获取的 xml 文件与新文件进行比较?

【问题讨论】:

    标签: xml feed polling feedparser stockquotes


    【解决方案1】:

    最新的项目是在提要的顶部还是底部?如果它们在顶部,那么当您看到已经存在于 数据库。

    如果最近的项目最后出现,您可以缓存引用键,然后在内存中查找它们,一旦找到非缓存的,就开始访问数据库。或者您可以记住您放入数据库中的最后一个报价,并且在解析所有项目时查找它,并且只在数据库中查找它之后的项目。

    【讨论】:

      【解决方案2】:

      您的问题分为两个方面:1)如何避免解析您不需要解析的内容,以及2)如何避免您也不需要的数据库操作。

      如果引号本身非常小,您可能不会从尝试解决 (1) 中获得太多收益。否则,您可以创建一个过滤器(例如使用 XSLT 或 SAX)来丢弃您不关心的引号,然后对其余部分进行完整的 DOM 解析。

      要解决 (2),区分 XML 文件通常会很棘手,因为 XML 文档中的空白更改(在某些提供程序中非常常见)可能会导致误报,并且您通常需要分析实际的XML 结构,而不是简单的文本逐行差异。如果您不认为这对您来说是个问题,那么您可以探索几个 Stack Overflow 主题,但我认为它们也将证明 XML 差异仍然是一个有点模糊的领域,尤其是在开源领域:

      另一种可行的方法是使用本地或分布式内存缓存来快速查找已更新的内容。您将获得避免尝试过滤或区分您的内容的好处,并且如果您正在构建长期基础架构,您可能很容易将缓存基础架构调整为其他用例。 OTOH,创建可扩展的分布式缓存基础设施并不是一个特别便宜的解决方案。

      【讨论】:

        猜你喜欢
        • 2014-06-15
        • 1970-01-01
        • 1970-01-01
        • 2017-05-04
        • 1970-01-01
        • 1970-01-01
        • 2012-08-12
        • 1970-01-01
        • 2015-04-16
        相关资源
        最近更新 更多