0

私がやろうとしているのは、Web サイト用の製品の 5Gb xml ファイルを調べて、最終的にデータをデータストアに追加することです。私は今キューをいじっています.私の考えは、ファイルを1行ずつ読み取り、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)
4

1 に答える 1

0

行が に一致"</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

于 2013-08-12T21:07:48.333 に答える