我有一个小的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行?
答案 0 :(得分:2)
调用fetchall
需要为所有结果记录分配内存。
您应该逐个阅读cin
的结果记录。