Python 模块:“;进程移到另一台机器上”;
我使用谷歌appengine模块上传约20k个实体 我尝试了很多方法来上传实体,我总是会“进程移动到另一台机器”,我的模块会终止。当我检查我的利用率时,我发现它的CPU总量超过了7170,所以我将最大实例数增加到了5(.yaml文件如下),并且为了避免任何内存问题,我将实例大小增加到了B4(512MB)。我没有配置任何队列,我使用默认队列,没有对其进行任何更改 下面是我的代码片段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
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/停止。我在没有查询的情况下运行了脚本,它运行得很好。