繁体   English   中英

Pyodbc execute 在很多行上需要很长时间

[英]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

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

此外,服务器端的大量 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM