2010-07-15 66 views
1

我认为我们都知道this page,但提供的基准是从两年多前提供的。所以,我想知道你是否可以指出最好的XML解析器。由于我只需要一个xml解析器,对我来说更重要的是速度超过其他任何东西。 我的目标是处理一些尺寸为4kb的xml提要(大约25k)(这将是一项日常任务)。正如你可能知道的那样,我受到了30秒请求超时的限制。那么,我可以使用哪种最好的解析器(仅限Python)?什么是GAE(Python版本)表现最好的xml解析?

谢谢你的服务员。

编辑01:

@Peter Recore 我会。我正在编写一些代码,并计划在不久的将来运行一些分析。关于你的问题,答案是否定的。与下载实际的xml Feed相比,处理只需要一点时间。但是,我无法提高Google的带宽,因此我现在只能专注于此。

我唯一的问题是,我需要尽可能快地做到这一点,因为我的目标是获取网站状态的快照。而且,因为互联网是实时的,人们不断添加和更改数据,所以我需要最快的方法,因为在“下载和处理”时间段内插入任何数据实际上都会混淆我的统计分析。

我以前是用我自己的电脑做的,当时过程花了24分钟,但现在网站有12倍的信息。

+4

如果XML解析占据了您的任务时间或将您接近30秒的限制,您应该重新考虑您的任务结构。很难回答这个问题,因为它确实是“什么是对特定输入最有效的解析器?”输入未定义的地方。 – msw 2010-07-15 02:37:50

+1

请发布您最终使用的结果,以便下一个人可以从您的研究中受益。另外,你确定这个任务的XML处理阶段真的会成为这些任务的瓶颈吗? – 2010-07-15 19:14:10

回答

1

我知道这并不直接提示我的问题,但id只是我所需要的。

我重申过,xml不是我可以使用的唯一文件类型,所以不是使用xml解析器,而是选择使用json。体积缩小约2.5倍。什么意思是下载时间的减少。我用simplejson作为我的json库。

我以前from google.appengine.api import urlfetch获得JSON提要并行:

class GetEntityJSON(webapp.RequestHandler): 
    def post(self): 
    url = 'http://url.that.generates.the.feeds/' 
    if self.request.get('idList'): 
     idList = self.request.get('idList').split(',') 

     try: 
     asyncRequests = self._asyncFetch([url + id + '.json' for id in idList]) 
     except urlfetch.DownloadError: 
     # Dealed with time out errors (#5) as these were very frequent 

     for result in asyncRequests: 
     if result.status_code == 200: 
      entityJSON = simplejson.loads(result.content) 
      # Filled a database entity with some json info. It goes like this: 
      # entity= Entity(
      # name = entityJSON['name'], 
      # dateOfBirth = entityJSON['date_of_birth'] 
      #).put() 

    self.redirect('/') 

    def _asyncFetch(self, urlList): 
    rpcs = [] 
    for url in urlList: 
     rpc = urlfetch.create_rpc(deadline = 10) 
     urlfetch.make_fetch_call(rpc, url) 
     rpcs.append(rpc) 
    return [rpc.get_result() for rpc in rpcs] 

我试图获得在一个时间10馈送,但大部分的时间单个提要提出的DownloadError#5(超时)。然后,我将截止日期增加到10秒,并开始一次获得5个Feed。

但是,25k提要一次获得5个,导致5k个呼叫。在一个可以每秒产生5个任务的队列中,总的任务时间最后应该是17分钟。