似乎将数组转换为元组所花费的时间与数组的长度呈线性关系。有没有办法更有效率地做到这一点?我需要将带有5e + 6个元素的数组插入到mysql数据库中,但MySQLdb似乎只接受元组或列表作为insertmany的输入。
答案 0 :(得分:4)
MySQLdb使用re
和字符串插值将参数化SQL与参数连接,然后将查询作为字符串传递给服务器。显然,这不是要走的路 - 不仅要将数组转换为元组,还要将元组转换为字符串。
相反,oursql将SQL查询与数据分开发送到MySQL服务器。
由于你有5个数组,使用zip
(或column_stack
)需要Python(或numpy)为组合对象(元组列表或2D numpy数组)分配更多内存。为避免这种情况,请使用itertools.izip:
import itertools as it
x=np.random.random(1e6)
y=np.random.random(1e6)
connection = oursql.connect(
host=config.HOST, user=config.USER, passwd=config.PASS, db='test')
with connection.cursor() as cursor:
sql='INSERT INTO foo (x,y) VALUES (?,?)'
cursor.executemany(sql,it.izip(x,y))
print(cursor.lastrowid)
PS。以前我建议使用oursql.BinaryIterWrapper
。我没能
然而,要使该解决方案起作用,可能是因为this bug。
PPS。我尝试使用MySQLdb计算上述自己的代码与类似的代码。 但是,自从它引发了
以来,MySQLdb没有时间可行_mysql_exceptions.OperationalError: (1153, "Got a packet bigger than 'max_allowed_packet' bytes")
on cursor.ecutemany(...)
。