优化Python代码以访问数据库
我正在开发一个应用程序,这个程序里的对象数据存储在多个mysql表中。当我需要处理这些对象(比如获取对象的属性或修改属性)时,我会用mysqldb查询sql数据库(进行选择或更新)。不过,由于这个应用程序计算量很大,执行时间让我很头疼。
我想了解有没有办法可以把所有数据一次性加载到python中,然后在这些对象上进行计算或修改,最后再把完整的数据更新回mysql数据库?如果一开始就把数据一次性加载到对象列表中,性能会不会有所提升?另外,数据库的大小大约是25MB,这样会不会导致内存问题呢?
谢谢大家!
2 个回答
请查看sqlalchemy,这是一个用于Python的对象关系映射工具。
sqlalchemy可以让你把数据库中的表格映射到Python对象上。这样一来,你就可以在Python对象上进行所有操作(数据加载后),处理完毕后再更新数据库。
假设你有一台普通的电脑,25MB的数据根本不算什么,你可以把整个数据库都缓存到内存里。
25Mb的文件非常小,几乎可以忽略不计。而SQL的速度则很慢,像冰川一样。
如果你没有事务(涉及锁定和多个用户),就不要浪费时间在SQL上。
如果你在做“分析”,尤其是需要大量计算的分析,最好把所有数据加载到内存中。
如果数据实在装不下内存,那就按照以下步骤来做。
把数据查询到平面文件中。这可以很快。如果你不使用Python,而是用数据库自带的工具把数据提取成CSV或其他小文件,那速度会更快。
读取平面文件并进行计算,然后再写入平面文件。这种方式非常快。
从平面文件进行批量更新。如果使用数据库自带的工具来插入或更新,这样做速度也是最快的。
如果你一开始根本不需要SQL,那就考虑一下你最初收到的数据,以及你打算怎么处理它。
读取原始文件一次,解析它,创建你的Python对象,然后把整个列表或字典保存成pickle文件。这意味着后续的程序可以直接加载这个pickle文件开始分析。不过,pickle文件不容易更新,你需要创建一个新的。这其实并不是坏事,它能给你完整的处理历史。
读取原始文件一次,解析它,使用shelve创建你的Python对象。这意味着你可以更新文件。
读取原始文件一次,解析它,创建你的Python对象,然后把整个列表或字典保存为JSON或YAML文件。这意味着后续的程序可以直接加载这个JSON(或YAML)文件开始分析。不过,JSON文件也不容易更新,你需要创建一个新的。这同样不是坏事,它能给你完整的处理历史。
这种方式可能会比pickle稍慢一些,并且你需要写一些辅助工具,以确保JSON对象能够正确地保存和加载。不过,读取JSON(和YAML)会给你在处理文件时带来一些优势。