0

我有一个小的 Python 2.7 脚本,它使用 LIKE 语句从存储在 SQLite 数据库中的文本数据中提取信息片段。

sql = "SELECT user_id, loc,\
        FROM entity\
        WHERE loc LIKE '%\"place\":%'\
        AND loc LIKE '%\"geo\":%'\
    AND loc LIKE '%\"coordinates\":%'" 
cin.execute(sql)
entities = cin.fetchall()

cin是 SQLite 数据库(entity>10^6 行的表)(~1.5GB)的游标,它是使用建立的

import sqlite3
try:
    dbin = sqlite3.connect(database=args['dbi'].name)
    dbin.row_factory = sqlite3.Row
    cin = dbin.cursor()
except sqlite3.Error, e:
    errorLogger.error('... %e' % e)
    sys.exit()

该脚本运行良好,数据库大小为 10^2 MB,但现在我得到了

Traceback (most recent call last):
  File "C:\Users\...\migrate.py", line 247, in <module>
    entities = cin.fetchall()
MemoryError

几秒钟后。我正在运行具有 8GB RAM 的 W7 64 位机器。当脚本运行时,通过查看 W7 的资源监视器,我可以看出,在程序崩溃之前,所有空闲内存都已连续使用,python.exe 消耗多达 1.9GB。尽管如此,仍然有大约 3GB 的备用内存可用(但不要问我备用内存和空闲内存有什么区别)。

除了预先过滤我的查询之外,我还能做些什么,例如,仅查看每个查询 10'000 行?

4

1 回答 1

2

调用fetchall需要为所有结果记录分配内存。

您应该cin一一读取结果记录。

于 2013-04-04T21:28:14.630 回答