
[英]Convert list of pyodbc.rows to pandas Dataframe takes very long time
[英]Pyodbc execute takes long time on a lot of rows
我有以下代码,我正在尝试读取一个非常大的表,该表在 MariaDB 上有超过 100M 的行。理论上执行只是要设置 cursor 然后每当我迭代一行时它会获取它或至少这就是它在文档中所说的。
import pyodbc
cnxn = pyodbc.connect('DRIVER=/usr/lib/libmaodbc.so;socket=/var/run/mysqld/mysqld.sock;Database=101m;User=root;Password=123;Option=3;')
cursor = cnxn.cursor()
cursor.execute("select * from vat")
for row in cursor:
print(row)
我尝试了以下版本的代码但没有结果。
import pyodbc
cnxn = pyodbc.connect('DRIVER=/usr/lib/libmaodbc.so;socket=/var/run/mysqld/mysqld.sock;Database=101m;User=root;Password=123;Option=3;')
with cnxn.cursor() as cursor:
cursor.execute("select * from vat")
for row in cursor:
print(row)
import pyodbc
cnxn = pyodbc.connect('DRIVER=/usr/lib/libmaodbc.so;Server=127.0.0.1;Database=101m;User=root;Password=123;Option=3;') # tcp instead of unix socket
with cnxn.cursor() as cursor:
cursor.execute("select * from 101m") # another big table
for row in cursor:
print(row)
更新:即使没有 for 循环,执行本身也需要很长时间。 我要做的是将数据从 MariaDb 服务器复制到 sqlite 数据库。
根据您的 ODBC DSN 服务器和客户端在同一台机器上运行。
在您的评论中,您提到要使用单个 select 移动 100GB。这将需要很多 memory
此外,服务器端的大量 GB 将用于准备和发送结果(注意服务器在同一台机器上运行)。 这将导致 memory 问题(交换)并减慢您的机器。
我建议分部分获取数据并改用 mariadb、pymysql 或 mysqldb 模块。
示例(没有任何异常处理):
import mariadb
conn= mariadb.connect(db="101m", user="root", password="123", host="localhost")
cursor= conn.cursor()
cursor.execute("SELECT COUNT(*) FROM vat")
total= cursor.fetchone()[0]
# This value depends on your system configuration
records = 2048
for i in range(0, total, step):
cursor.execute("select * from vat LIMIT ?, records", (i, step))
rows= cursor.fetchall()
# process result
另一种解决方案是使用服务器端游标,但此解决方案仅受 mariadb 模块支持:
cursor= conn.cursor(cursor_type=CURSOR.READ_ONLY, prefetch_size=4096)
cursor.execute(SELECT * from vat")
for row in cursor:
#process row
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.