最近做了一些rails数据导出的工作,就是把一些特定的ActiveRecord数据挖出来,保存到表格里面。 需要注意几件事:执行速度,内存消耗,以及调试速度。
执行速度
导数据的程序基本上就是一个循环体,外部获取数据集,内部把一条数据转换成表格。 在内部,往往需要通过一条记录作为主体,通过数据库逻辑关系顺藤摸瓜挖出一批数据, 这样会形成一批短查询,因为是在循环体里面,会带来很大时间上的消耗,比如:
可以先把这些查询汇总起来,一次查询掉,然后在循环体内部筛选出对应的数据:
内存消耗
查询大量数据的时候,可以首先查所有的ID,然后分批查询,这样防止序列化大量的数据库对象:
数据全部缓存在一个array中的话,会占用大量内存,最好是通过数据流的方式一个个输出处理,用后即丢:
在循环体内部,尽量用局部变量,不用的资源会更早释放。
跑数据导出的时候,最好同时注意一下服务器的剩余内存。不要把其它服务搞挂了。
调试速度
导数据最花费时间的往往还是调试过程。
调试的时候,可以只返回几条数据,检查完毕之后再全部跑。
需要考虑数据并不是很规整,做好预防性编程。
很多时候难免特定数据不符合预设状况,最好循环体内部记录log,出现问题可以跟踪。 比如下面的例子,unit没有oldest_driver的时候,会报错,记录了日志,就知道在哪条上面出现了问题。
导出数据可以生成两个版本,一个给客户,另外一个加上一些debug数据方便自己分析。
架构设计
代码架构上面最重要的是职责清晰。导出数据的逻辑比较简单,分离出导数据类,以及处理数据类就可以了: