sirlark..
23
该解决方案使用Kieth的fromiter技术,但更直观地处理SQL结果的二维表结构.此外,它通过避免python数据类型中的所有重新整形和展平来改进Doug的方法.使用结构化数组,我们可以直接从MySQL结果读取到numpy,几乎完全删除python数据类型.我说"差不多"因为fetchall迭代器仍然会产生python元组.
但有一点需要注意,但这不是一个大问题.您必须事先知道列的数据类型和行数.
知道列类型应该是显而易见的,因为你可能知道查询是什么,否则你总是可以使用curs.description,以及MySQLdb.FIELD_TYPE.*常量的映射.
知道行数意味着您必须使用客户端游标(这是默认值).我对MySQLdb和MySQL客户端库的内部结构还不太了解,但我的理解是,当使用客户端游标时,整个结果被提取到客户端内存中,尽管我怀疑实际上存在一些缓冲和缓存.这意味着为结果使用双内存,一次用于光标复制,一次用于数组复制,因此如果结果集很大,最好关闭光标以释放内存.
严格来说,您不必提前提供行数,但这样做意味着数组内存预先分配一次,并且不会随着更多行从迭代器进入而不断调整大小,这意味着提供巨大的性能提升.
有了这个,一些代码
import MySQLdb
import numpy
conn = MySQLdb.connect(host='localhost', user='bob', passwd='mypasswd', db='bigdb')
curs = conn.cursor() #Use a client side cursor so you can access curs.rowcount
numrows = curs.execute("SELECT id, rating FROM video&#