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