15 十月, 2008
GAE SDK的批量数据上传工具
总有些Datastore,譬如说常量表等,需要初始化的数据,写了一小段代码执行数据初始化,不过始终无法正常执行,原因是GAE服务器在操作开始后不久就返回timeout或者exceed CPU quota错误。
实际上,GAE允许的一天CPU使用的QUOTA有200,000,000 megacycles,而需要初始化的只有1200多条记录,理论上,绝无超标的可能。但是GAE Quota System它的主要任务是保证应用在整个一天之内的可用性,象上面提到的这种集中使用CPU的操作,Quota System认为它可能会影响应用在接下来的时间内对CPU资源的利用,所以也会以exceed quota的理由拒绝。(参考:Understanding Application Quotas with Google App Engine)
试了几次,都不行,没辙了,又返回去看GAE Articles,才注意到GAE SDK中就带有"Bulk Data Uploader"(tools/bulkload_client.py),这才是正道啊。(参考:Uploading Data with Bulk Data Uploader)
然而,事实胜于雄辩,经过测试,Bulk Data Uploader一样不能避免上述Quota limit的问题,特别是batch_size比较大的时候。而且,对于中文数据,因为Python 2.5缺省的codec是ascii而不是utf-8,所以在调用cvs库的iter方法时,会由于无法成功encode而触发类似"UnicodeEncodeError: 'ascii' codec can't encode characters in position 3-7: ordinal not in range(128)"这样的异常。
解决办法:减少batch_size的值,每一次少上传一些数据,减少GAE那里datastore的压力;并且,将bulkload.Loader拷贝到本地,修改代码,在调用cvs reader的iter方法之前,显式地将数据转换为utf-8格式:data=data.encode('utf-8')



