2011-04-01 72 views
-1

我正在写一个组件,该组件使用股票报价分析xml供稿,并将结果保存在数据库中。这个问题相当简单,除了feed不能递增阅读。也就是说,没有办法指定您只希望X最后一次报价更改或仅更改比X分钟更新,比如说。我知道真正的问题是饲料是愚蠢的,供应商应该修理他们的东西,但这不是一个选项atm。解析巨大的XML供稿时处理重复的数据

Feed是一个巨大的xml文件,其中包含提供商的最后100000个股票报价。饲料每分钟轮询一次,在此期间大约有50到100次更改报价。其余部分是重复的引号,它们会一遍又一遍读取。

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

但仍然有50k db查询,每个引号必须单独检查,如果存在或不存在,这对数据库非常重要。

所以我在找的是关于如何使我的提要解析器更快的想法。也许有一种方法来区分上一次获取的XML文件与新的?

+0

哪个数据库? – ajreal 2011-04-01 08:41:14

回答

1

Feed的顶部或底部是最近的项目吗?如果他们位于顶部,那么当您看到数据库中已存在的第一个项目时,您可以停止解析。

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

1

你的问题分为两个方面:1)如何避免解析你不需要解析的东西; 2)如何避免你不需要的数据库操作。

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

要解决(2),通常情况下,区分XML文件可能会非常棘手,因为您的XML文档中的空白变化,对某些提供程序来说太常见了,可能会导致误报,并且您通常需要分析实际的XML结构,而不是简单的文本逐行比较。如果您不认为这会对您造成任何问题,您可以探索几个Stack Overflow主题,但我认为他们还会证明XML差异仍然有点毛毛,特别是在开源领域:

另一种方法可以工作将使用一个已经更新的东西迅速查找本地或分布式内存缓存。您将获得避免尝试过滤或区分内容的好处,并且如果您正在构建长期基础架构,则可以随时调整您的缓存基础架构以用于其他用例。 OTOH创建可扩展的分布式缓存基础架构并不是特别便宜的解决方案。