我正在构建一个包含对象的应用程序,这些对象的数据存储在mysql表中(跨多个表)。当我需要使用对象(检索对象属性/更改属性)时,我使用mysqldb(select / update)查询sql数据库。但是,由于应用程序非常耗费计算量,因此执行时间会让我感到害怕。
想要了解是否存在将所有数据加载到python中的方法,对这些对象进行计算/修改,然后对mysql数据库进行完整的数据更新?是否会从数据库中一次性将数据最初加载到这些对象的列表中,从而提高性能?此外,由于db大小接近25 mb,它是否会导致任何内存问题。
提前致谢。
答案 0 :(得分:5)
25Mb很小。微观的。 SQL很慢。冰。
除非您有交易(包含锁定和多个用户),否则不要在SQL上浪费时间。
如果您正在进行“分析”,尤其是计算密集型分析,请将所有数据加载到内存中。
万一数据不适合内存,请执行此操作。
将数据查询到平面文件中。这可能很快。如果你不使用Python,它是最快的,但使用数据库本机工具将数据提取到CSV或小的东西。
读取平面文件并进行计算,编写平面文件。这真的很快。
从平面文件进行批量更新。同样,如果您使用数据库本机工具集进行插入或更新,这是最快的。
如果您首先不需要SQL,请考虑您最初收到的数据以及您将要使用的数据。
读取原始文件一次,解析它,创建Python对象并挑选整个列表或字典。这意味着每个后续程序都可以简单地加载pickle文件并开始进行分析。然而。您无法轻松更新pickle文件。你必须创建一个新的。这不是一件坏事。它为您提供完整的处理历史记录。
读取原始文件一次,解析它,使用shelve创建Python对象。这意味着你可以 更新文件。
读取原始文件一次,解析它,创建Python对象并将整个列表或字典保存为JSON或YAML文件。这意味着每个后续程序都可以简单地加载JSON(或YAML)文件并开始进行分析。然而。您无法轻松更新文件。你必须创建一个新的。这不是一件坏事。它为您提供完整的处理历史记录
这可能比酸洗略慢。并且它将要求您编写一些帮助程序,以便正确地转储和加载JSON对象。但是,您可以阅读JSON(和YAML),为您提供使用该文件的一些优势。
答案 1 :(得分:0)
请检查sqlalchemy,Python的对象关系映射器。
sqlalchemy允许您将数据库表映射到Python对象。执行此操作时,可以在Python对象上完成所有操作(一旦加载数据),并且在完成处理后,您可以更新数据库。
假设您有一台现成的基准计算机,25 MB绝对没什么大不了的,您可以将整个数据库缓存到内存中。