我目前正在使用两个数据存储区实体Filing
和Document
。 Filing
可以包含多个Documents
:
目前,我们的用户可以查找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更新数据存储的经验?
答案 0 :(得分:1)
错误消息表明您的应用使用F1
(默认为自动缩放)或B1
instance class,其内存限制为128M。
您可以尝试的一件事是在app.yaml
文件中配置一个具有更多内存的实例类(也可能更快)。另请参阅Syntax表中的instance_class
行。
旁注:当我因为同样的原因将我的实例类提高时,我也注意到我在代码中的gc.collect()
调用开始明显有效。不完全确定原因,我怀疑是因为更快的实例和更高的内存限制使它有足够的时间在实例被杀之前启动。这也应该有所帮助。