K_Reverter的网页开发记录

要么不做,要么就当作艺术品来做!

导航

向Google App Engine上传数据的几个心得(下)

    上次写了一个(上)之后,就接着不停的上传数据,最后终于将我的几个超级大的数据上传完毕,这也证明我的数据上传的方法是能够走通的,因此我再就几个需要注意的问题再补充一下:
    一、续传的问题,这个问题至关重要,Google的文章上建议使用“Sqlite”来完成,我开始的时候安装了Sqlite,却始终没有搞明白怎么才能让它断点续传,最后我只好放弃了Sqlite,按照下面这个方式手工续传:
    1.使用"--num_threads=1"参数将线程数更改为1,省得被这些线程搞乱了;
    2.每次上传之后,通过上传的结果报告,将前面成功的行删除,然后再接着传;
    这个方法实在是笨的不能再笨了,其实,只要指定db_filename参数(而且不能指定为skip)即可使用Sqlite来断点续传,我原先以为不需要指定这个参数就可以自动断点续传,后来发现如果不使用这个参数,会使用时间戳作为每次上传进度文件的文件名,这样每次都是采用不同的进度文件,也就不可能接着上次的来继续传了。
    后来再上传数据的时候,我就采用了这个db_filename参数,就方便多了,也可以采用多线程,快了很多,不过需要注意的是,我觉得默认的num_threads参数太大(10),上传经常出问题,改成5就差不多了,不过这也可能是我这边的网速的原因。
    二、数据清除的问题,有时候上传的数据有问题,或者有的表不再需要,想删除所有的数据(或者根据一个查询删除部分数据),怎么办?GAE的管理界面没有提供这样的功能,只能自己做,如果自己做,会有如下障碍:
    1.GQL之中没有删除语句,只能查询出结果集,然后删除;
    2.GQL每次最个查询最多返回1000条结果;
    3.Appspot对文件执行时间有限制,很容易超时;
    考虑到以上几种限制,我做了一个通过不停刷新页面来实现删除表内容的程序,代码如下:

 

data_cleantable.py

 

    上面的页面每次删除100条结果,为什么不用最大的1000条呢?因为一次查询1000条并删除要的时间比较长,可能会遭遇Google的页面运行时间限制,因此,每次只删除100条;
    很遗憾的是,必须手工将每个要操作的表的定义添加到这个文件之中,和上面的Train_stations一样,因此,你如果要使用此代码,可能要将你需要操作的所有数据表的定义加入到此文件之中,否则会得到一个"No implementation for kind *"的错误,本来我很试试调用"datastore_admin"来实现自动的调用数据表定义的,可是最终也没有成功,因此只好作罢。
    你可以将上面的代码部署到自己的Appspot里面运行,不过要记得在"app.yaml"之中注册此程序,并且设置为"login: admin",否则可能会出现安全问题。

    三、数据记录数的问题,通常我们上传了记录都应该知道当前系统之中记录究竟有多少条,因为我对Google使用的bigtable的机制不是很清楚,我不知道Google为什么不提供此功能,我们还是要自己来做这个功能,和删除的功能差不多,一样会遇到以下问题:
    1.GQL之中没有Count语句,你只能逐条的查询出来,才能数出数目
    2.GQL每次最个查询最多返回1000条结果;
    3.Appspot对文件执行时间有限制,很容易超时;
    因此,大体上仿照上面的代码,进行实现的CountTable代码如下:

 

data_counttable.py

 

    这个文件和上面的删除差不多,用法也一样,假如在计算的过程中,出现临时出错或者空白页的情况,只管刷新让其继续运行即可,也不会数错的。
    虽然这个功能是每次数1000个,每个页面数10次,不过因为运行比较慢,要数100万的数据好事需要几分钟的,如果要进行改进,加快速度,应该可以采用fetch的offset参数,毕竟每次获取1000条数据却只读取最后一条还是挺浪费性能的,如果能使用q.fetch(1,999),想必应该会快很多,不过这样的话,就需要在返回结果为空的时候(说明数目不够1000条),重新查询fetch(1000)以得到剩余的记录总数,程序会复杂一点点,需要改进此程序速度的网友可以自己尝试一下。
    我发现我上传的记录数比较多的表,数出来的数目总是对不上(总是略多一点),不知道是上传的时候多了,还是以上计算数目的程序算法有误,我希望上传了数据的网友来反馈一下。
    到此,我关于数据上传的心得就介绍完毕,由于GAE的GQL支持的功能很少,想必后面的开发之后会遇到更多问题吧!

posted on 2009-03-17 09:14  K_Reverter  阅读(1679)  评论(9编辑  收藏  举报