App Engine 批量加载器性能
我正在使用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_instance
和bulkload_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
更新:为了测试批量加载过程的性能,我加载了一个“测试”Kind
的entities
。尽管这个entity
只有一个非常简单的FloatProperty
,但批量加载这些entities
仍然花费了同样的时间。
我还打算尝试调整批量加载器的参数,比如rps_limit
、bandwidth_limit
和http_limit
,看看能否提高吞吐量。
1 个回答
有一个叫做 rps_limit
的参数,它决定每秒可以上传多少个实体。这是一个主要的瓶颈。默认值是 20
。
另外,建议把 bandwidth_limit
增加到一个合理的值。
我把 rps_limit
增加到了 500
,结果一切都变好了。我现在上传1000个实体的时间从之前的50秒缩短到了5.5到6秒,这可是个大进步!