App Engine 批量加载器性能

5 投票
1 回答
1040 浏览
提问于 2025-04-16 03:52

我正在使用App Engine的批量加载工具(Python运行环境)来批量上传数据到数据存储中。我上传的数据是以一种专有格式存储的,所以我自己实现了一个连接器(在bulkload_config.py中注册),用来把它转换成中间的Python字典。

import google.appengine.ext.bulkload import connector_interface
class MyCustomConnector(connector_interface.ConnectorInterface):
   ....
   #Overridden method
   def generate_import_record(self, filename, bulkload_state=None):
      ....
      yeild my_custom_dict

为了把这个中性的Python字典转换成数据存储的实体,我在我的YAML文件中定义了一个自定义的后导入函数。

def feature_post_import(input_dict, entity_instance, bulkload_state):
    ....
    return [all_entities_to_put]

注意:在我的feature_post_import函数中,我没有使用entity_instancebulkload_state。我只是根据我的input_dict创建新的数据存储实体,并返回它们。

现在,一切都运行得很好。不过,批量加载数据的过程似乎花费了太多时间。例如,加载一GB(大约1,000,000个实体)数据大约需要20个小时。我该如何提高批量加载的性能呢?我是不是漏掉了什么?

我在使用appcfg.py时的一些参数是(10个线程,每个线程处理10个实体)。

这里有一个链接到Google App Engine Python小组的帖子:http://groups.google.com/group/google-appengine-python/browse_thread/thread/4c8def071a86c840

更新:为了测试批量加载过程的性能,我加载了一个“测试”Kindentities。尽管这个entity只有一个非常简单的FloatProperty,但批量加载这些entities仍然花费了同样的时间。

我还打算尝试调整批量加载器的参数,比如rps_limitbandwidth_limithttp_limit,看看能否提高吞吐量。

1 个回答

4

有一个叫做 rps_limit 的参数,它决定每秒可以上传多少个实体。这是一个主要的瓶颈。默认值是 20

另外,建议把 bandwidth_limit 增加到一个合理的值。

我把 rps_limit 增加到了 500,结果一切都变好了。我现在上传1000个实体的时间从之前的50秒缩短到了5.5到6秒,这可是个大进步!

撰写回答