模块:“流程移动到不同的机器”

时间:2014-08-01 21:59:43

标签: python google-app-engine google-cloud-datastore

我使用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数据存储中?

1 个答案:

答案 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"}))