【问题标题】:Disabling cached results in mysql (using python)禁用mysql中的缓存结果(使用python)
【发布时间】:2012-08-23 05:24:39
【问题描述】:

我正在使用 python 2.7、pyodbc 和 mysql 5.5。我在窗户上

我有一个返回数百万行的查询,我想分块处理它。 使用 fetchmany 函数。

他是代码的一部分

import pyodbc
connection = pyodbc.connect('Driver={MySQL ODBC 5.1 Driver};Server=127.0.0.1;Port=3306;Database=XXXX;User=root; Password='';Option=3;')

cursor_1 = connection.cursor()
strSQLStatement = 'SELECT x1, x2 from X'

cursor_1.execute(strSQLStatement)
# the error occurs here  

x1 = cursor_1.fetchmany(10)
print x1
connection.close()

我的问题:

  1. 我收到错误 MySQL 客户端内存不足

  2. 我猜这是因为cursor_1.execute 尝试将所有内容读入内存并尝试以下(一一)但无济于事

    1. 在用户界面(ODBC - 管理工具)中,我勾选了“不缓存仅转发游标的结果”
    2. connection.query("SET GLOBAL query_cache_size = 40000")

我的问题:

  1. pyodbc 是否可以运行查询并仅按需提供结果?

  2. MySQL 手册建议invoke mysql with the --quick option。不使用命令行时也可以这样做吗?

感谢您的帮助。

P.S:也欢迎提供替代 MySQL 模块的建议,但我使用的是可移植的 python,所以我的选择有限。

【问题讨论】:

  • 为什么不在查询本身中使用LIMIT 10

标签: python mysql pyodbc


【解决方案1】:

将 MySQLdb 与 SSCursor 一起使用将解决您的问题。

不幸的是,文档不是很好,但在 user guide 中提到了它,您可以找到一个示例 in this stackoverflow question

【讨论】:

  • 谢谢米海。我非常想使用 pyodbc 或另一个在 Windows 上毫无问题地工作的 DB API(在我使用的便携式版本上)来做到这一点。 MySQLdb 窗口不是这种情况。不过还是谢谢。
  • 你试过 PyMySQL(纯 python 客户端)吗?它也支持 SSCursors,但我没有个人经验
  • 我终于安装了 ActivePython 和 MySQLdb 但并没有解决问题。仍然存在内存问题。事实上,文档 mysql-python.sourceforge.net/MySQLdb-1.2.2/public/…> 说 SSCursor 将结果保存到服务器(我猜它会获取所有内容)。我也尝试设置 arraysize cursor_1.arraysize= 2 但它没有帮助。 P.S:我不知道 ActivePython 实际上是可移植的(有一个没有安装程序的 zip 版本)。 MySQLdb 在那里被称为 MySQL-python 。另一个相关问题 337479 我将使用 sqlite
【解决方案2】:

在查询字符串上使用 LIMIT 子句。

http://dev.mysql.com/doc/refman/5.5/en/select.html

通过使用

SELECT x1, x2 from X LIMIT 0,1000 

你只会得到第一个 1k 记录,然后通过这样做:

SELECT x1, x2 from X LIMIT 1000,2000 

您将获得接下来的 1k 条记录。

适当循环以获取所有记录。 (我不知道python所以在这里帮不上忙:()

【讨论】:

  • 谢谢。这将是最后的选择(可以说是核选择)。
  • 刚刚收到这条评论,想扩展上面的评论。这确实是 nuclear option b/c 你没有告诉 mysql 以哪种方式订购它们。如果在两个查询之间插入了一些东西,你会得到不确定的结果 b/c mysql 返回没有 order by 的行的方式。如果没有修复,按限制排序是非常低效的。更好的选择是 BETWEEN N AND M 并自己跟踪 N 和 M。
猜你喜欢
  • 2016-04-17
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
相关资源
最近更新 更多