从大型数据库读取时SQLite3内存错误(> 1GB)

时间:2013-04-04 20:09:35

标签: python eclipse memory sqlite

我有一个小的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行?

1 个答案:

答案 0 :(得分:2)

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

您应该逐个阅读cin的结果记录。