mariadb Pyodbc在许多行上执行需要很长时间

to94eoyn  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(123)

我有下面的代码,我试图读取一个非常大的表,在MariaDB上有超过1亿行。理论上,execute只会设置游标,然后每当我迭代一行,它会获取它,或者至少这是它在文档上说的。

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)

我尝试了以下版本的代码,但没有结果。
x一个一个一个一个x一个一个二个x
更新:即使没有for循环,执行本身也需要很长时间。我尝试做的是从MariaDb服务器复制数据到一个sqlite数据库。

5lwkijsr

5lwkijsr1#

根据ODBC,DSN服务器和客户端运行在同一台机器上。
在你的评论中,你提到你想通过一次选择移动100GB。这将需要大量的内存

  • 100 GB用于客户端网络缓冲区
  • 100 GB用于客户端行缓冲区

另外,服务器端的大量GB将用于准备和发送结果(注意,服务器运行在同一台机器上)。这将导致内存问题(交换)并降低机器速度。
我建议分部分获取数据,并使用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

相关问题