数据存储区中的appengine-mapreduce:内存问题

时间:2017-05-21 13:39:04

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

我目前正在使用两个数据存储区实体FilingDocumentFiling可以包含多个Documents

  • 提交 - 800万个实体
  • 文件 - 3500万个实体,它们可能很大,但总是低于1 Mb。

目前,我们的用户可以查找Filings,但在添加数据时,我发现某些Document实体存在问题 - KeyProperty上的Filings是缺少(解析器的问题)。

由于我的文档具有格式为FilingID_documentNumber的个人ID,因此我决定使用appengine-mapreduce添加指向KeyProperty的缺失Filing,以便我可以获取所有{ {1}}对于给定的Documents

所以我创建了以下MapReduce作业:

Filing

我的问题是我目前无法运行此映射器,因为我遇到了很多内存错误。在日志中,我注意到很多分片都出现以下错误:

  

超过128 MB的软私有内存限制,154 MB后   服务2个请求总数在处理此请求时,该过程   处理此请求被发现使用了太多的内存和   被终止了。这可能会导致使用新流程   下一个申请的请求。如果你看到这条消息   经常,您的应用程序可能会出现内存泄漏。

我试过了:

  • 在地图工具
  • 上添加@ndb.toplevel def map_callback(ed): gc.collect() try: if(ed.filing is None): ed.filing = ndb.Key("Filing", ed.key.id().split("_")[0]) yield op.db.Put(ed) yield op.counters.Increment("n_documents_fixed") except: yield op.counters.Increment("saving_error") class FixDocs(base_handler.PipelineBase): def run(self, *args, **kwargs): """ run """ mapper_params = { "input_reader": { "entity_kind": "datamodels.Document", "batch_size": 10, #default is 50 } } yield mapreduce_pipeline.MapperPipeline( "Fix Documents", handler_spec="search.mappers.fix_documents.map_callback", input_reader_spec="mapreduce.input_readers.DatastoreInputReader", params=mapper_params, shards=128)
  • 减少@ndb.toplevel,因为默认值为50,我认为文档可能会变得相当大(其中一个字段是batch_size

但是这两项修改似乎都没有改善工作的执行。

有没有人知道如何改进它?另外我读到Dataflow可能适合这个,有没有人有使用Dataflow更新数据存储的经验?

1 个答案:

答案 0 :(得分:1)

错误消息表明您的应用使用F1(默认为自动缩放)或B1 instance class,其内存限制为128M。

您可以尝试的一件事是在app.yaml文件中配置一个具有更多内存的实例类(也可能更快)。另请参阅Syntax表中的instance_class行。

旁注:当我因为同样的原因将我的实例类提高时,我也注意到我在代码中的gc.collect()调用开始明显有效。不完全确定原因,我怀疑是因为更快的实例和更高的内存限制使它有足够的时间在实例被杀之前启动。这也应该有所帮助。