Python 模块:“;进程移到另一台机器上”;

Python 模块:“;进程移到另一台机器上”;,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,我使用谷歌appengine模块上传约20k个实体 我尝试了很多方法来上传实体,我总是会“进程移动到另一台机器”,我的模块会终止。当我检查我的利用率时,我发现它的CPU总量超过了7170,所以我将最大实例数增加到了5(.yaml文件如下),并且为了避免任何内存问题,我将实例大小增加到了B4(512MB)。我没有配置任何队列,我使用默认队列,没有对其进行任何更改 下面是我的代码片段 def PutInNDB_withEntityList(productList): someKeys = n

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

代码不适合注释,因此下面是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"}))

如果您所做的一切都是put,为什么不在主代码中简单地使用put\u async呢?put\u multi\u async或put\u async也有同样的问题,同样的错误。与其在延迟调用中运行它,只需在主函数的productList上运行put\u multi\u async。感谢Bruyere,我做到了,put\u multi\u async也有同样的问题,在~10k个实体之后,内存开始崩溃,最终我得到“进程移动到另一台机器”我们可以在这里尝试一些东西。首先,您必须使用“NDB”吗NDB'在将其发送到数据存储之前使用memcache。你能试着用db来输入吗?第二,您是手动生成还是允许GAE生成密钥?如果使用“手动生成关键点”,可能会导致碰撞,从而减慢过程。你的实体有多大?它们是否包含大量数据?以块的形式处理数据的好方法。对较大的块尝试了这种方法,使用B4机器,这一次是在每个块(~1K)之后进行无法解释的/_ah/停止。我在没有查询的情况下运行了脚本,它运行得很好。