优化Python代码以访问数据库

2 投票
2 回答
1364 浏览
提问于 2025-04-16 04:27

我正在开发一个应用程序,这个程序里的对象数据存储在多个mysql表中。当我需要处理这些对象(比如获取对象的属性或修改属性)时,我会用mysqldb查询sql数据库(进行选择或更新)。不过,由于这个应用程序计算量很大,执行时间让我很头疼。

我想了解有没有办法可以把所有数据一次性加载到python中,然后在这些对象上进行计算或修改,最后再把完整的数据更新回mysql数据库?如果一开始就把数据一次性加载到对象列表中,性能会不会有所提升?另外,数据库的大小大约是25MB,这样会不会导致内存问题呢?

谢谢大家!

2 个回答

0

请查看sqlalchemy,这是一个用于Python的对象关系映射工具。

sqlalchemy可以让你把数据库中的表格映射到Python对象上。这样一来,你就可以在Python对象上进行所有操作(数据加载后),处理完毕后再更新数据库。

假设你有一台普通的电脑,25MB的数据根本不算什么,你可以把整个数据库都缓存到内存里。

5

25Mb的文件非常小,几乎可以忽略不计。而SQL的速度则很慢,像冰川一样。

如果你没有事务(涉及锁定和多个用户),就不要浪费时间在SQL上。

如果你在做“分析”,尤其是需要大量计算的分析,最好把所有数据加载到内存中。

如果数据实在装不下内存,那就按照以下步骤来做。

  1. 把数据查询到平面文件中。这可以很快。如果你不使用Python,而是用数据库自带的工具把数据提取成CSV或其他小文件,那速度会更快。

  2. 读取平面文件并进行计算,然后再写入平面文件。这种方式非常快。

  3. 从平面文件进行批量更新。如果使用数据库自带的工具来插入或更新,这样做速度也是最快的。


如果你一开始根本不需要SQL,那就考虑一下你最初收到的数据,以及你打算怎么处理它。

  1. 读取原始文件一次,解析它,创建你的Python对象,然后把整个列表或字典保存成pickle文件。这意味着后续的程序可以直接加载这个pickle文件开始分析。不过,pickle文件不容易更新,你需要创建一个新的。这其实并不是坏事,它能给你完整的处理历史。

  2. 读取原始文件一次,解析它,使用shelve创建你的Python对象。这意味着你可以更新文件。

  3. 读取原始文件一次,解析它,创建你的Python对象,然后把整个列表或字典保存为JSON或YAML文件。这意味着后续的程序可以直接加载这个JSON(或YAML)文件开始分析。不过,JSON文件也不容易更新,你需要创建一个新的。这同样不是坏事,它能给你完整的处理历史。

    这种方式可能会比pickle稍慢一些,并且你需要写一些辅助工具,以确保JSON对象能够正确地保存和加载。不过,读取JSON(和YAML)会给你在处理文件时带来一些优势。

撰写回答