我使用google appengine模块上传~20k实体。
我尝试了很多方法来上传实体,我总是得到"流程移动到另一台机器"我的模块终止了。当我检查我的利用率时,我发现它已加标总CPU> 7170,所以我将最大实例增加到5(下面的.yaml文件)并阻止任何内存问题我将实例大小增加到B4(512MB)。我没有配置任何队列,我使用默认队列而没有任何更改。
以下是我的代码片段
def PutInNDB_withEntityList(productList):
someKeys = ndb.put_multi(productList)
在我的主要功能中,我呼吁每200个实体
deferred.defer(PutInNDB_withEntityList, productList)
我的modul.yaml文件配置为
application: dummyapp
module: modul
version: 3-2-jul27
runtime: python27
api_version: 1
instance_class: B4
threadsafe: true
basic_scaling:
max_instances: 5
idle_timeout: 1m
builtins:
- deferred: on
handlers:
- url: /.*
script: somescript.app
libraries:
- name: webapp2
version: "2.5.2"
如何在不突然启动进程的情况下,将大型数据集(20K实体)可靠地存储到NDB数据存储中?
答案 0 :(得分:0)
代码不适合评论,所以这里是id做的。如果需要,您可以轻松地将其调整为任务
class DatastoreInfo(db.Model):
Cursor = db.StringProperty()
NumItemsProcessed = db.IntegerProperty()
class MainPage(webapp2.RequestHandler):
qry = appareldb.WomenApparel.all()
qry = qry.filter('productId =', product.get('product_id'))
dsInfo = DatastoreInfo.all().fetch(1)
if(len(dsInfo) == 0):
dsInfo = DatastoreInfo(NumItemsProcessed=0)
else:
dsInfo = dsInfo[0]
qry.with_cursor(start_cursor=dsInfo.Cursor)
itemIterator = qry.fetch(limit=500)
if len(itemIterator) > 0:
dsInfo.Cursor = empQuery.cursor()
dsInfo.NumItemsProcessed += len(empIterator)
dsInfo.put()
for itemEntity in itemIterator:
# Do work here
db.put(itemIterator)
self.redirect("/")
else:
dsInfo.delete()
self.response.out.write(jinja2.Environment(loader=jinja2.FileSystemLoader("templates"), autoescape=True)
.get_template("index.html").render({"numItems":"Finished"}))