私がやろうとしているのは、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)