簡體   English   中英

使用任務隊列解析大型xml數據

[英]Using task queue to parse large xml data

所以我想做的是瀏覽網站的產品的5Gb xml文件,最后將數據添加到數據存儲中。 我現在只是在處理隊列,我的想法是創建一個隊列,該隊列將逐行讀取文件並獲取每50個產品,並將它們發送到另一個要處理的隊列(最終發送到數據存儲區)。 我正在對一個較小的xml文件進行測試。 我的問題在OpenFileQueue中,即使沒有滿足條件“ if((self.count%50)== 0):”,它也會創建一個隊列。 有什么想法可能會發生什么? 或有關通讀此文件的更好方法的想法。 感覺就像是現在的方式一樣糟糕。 我現在運行代碼並調用/ gcs時,正在使用的測試文件大約有170種產品,最終導致大約86個隊列。 不知道這是怎么回事。

import webapp2
import os
import datetime
import time
from lxml import etree
import sys
import codecs
import time
import gc
import logging


from google.appengine.ext import db
from google.appengine.api import search
import cloudstorage as gcs
from google.appengine.api import taskqueue

my_default_retry_params = gcs.RetryParams(initial_delay=0.2,
                                      max_delay=5.0,
                                      backoff_factor=2,
                                      max_retry_period=15)
gcs.set_default_retry_params(my_default_retry_params)

logging.getLogger().setLevel(logging.DEBUG)


class GoogleCloudStorage(webapp2.RequestHandler):

    def get(self):
        bucket = '/newegg-catalog'
        self.response.headers['Content-Type'] = 'text/plain'
        self.tmp_filenames_to_clean_up = []    
        filename = bucket + '/ndd.xml'     
        taskqueue.add(url='/openfile', params={'filename': filename})
        self.redirect('/')



class AddFileParts(webapp2.RequestHandler):
     def post(self):
         data = self.request.get('data')
         logging.debug('PROCESSING %s', data)

class OpenFileQueue(webapp2.RequestHandler):
    def __init__(self, request, response):
        self.initialize(request, response)
        self.Plist = []
        self.masterList = []
        self.count = 0

    def post(self):
        filename = self.request.get('filename')
        logging.debug('Opening file %s', filename)
        gcs_file = gcs.open(filename)

        while True:
            line = gcs_file.readline()
            self.Plist.append(line)
            if line.strip()=="</product>":
                self.masterList.append(self.Plist)
                self.Plist = []
                self.count+=1

            if ((self.count % 50) == 0):
                logging.debug('Starting queue of items up to %s with 50 items', self.count)
                taskqueue.add(url='/adddata', params={'data': self.masterList})
                self.masterList = []
            if line.strip()=="</catalog>":
                break
        gcs_file.close()

app = webapp2.WSGIApplication([('/adddata',AddFileParts),
                                ('/openfile', OpenFileQueue),
                                ('/gcs', GoogleCloudStorage)],
                                debug=True)

當一行匹配"</product>" ,它將追加到self.masterlist並遞增self.count (最終為50)。 但是,如果下一行不是"</product>" ,則計數仍為50,並將另一個任務添加到隊列中。

相反,請使用self.masterList的長度,因為它會在添加到隊列后重置:

if len(self.masterList) >= 50:
    logging.debug('Starting queue of items up to %s with 50 items', len(self.masterList))
    taskqueue.add(url='/adddata', params={'data': self.masterList})
    self.masterList = []

並刪除所有對self.count引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM