运行 在 Python 中使用 namedtuples 的字典内存不足

Running out of memory in Python using dict of namedtuples

我有一组问题,我希望能够在不使用 SQL 回答的情况下回答这些问题。当我决定在 Python.

中进行树遍历更容易时,我在查询中进行了大约 9 个子选择

问题是当我试图将我关心的所有数据(32 亿行)放入我的机器时 Python 我 运行 内存不足。

from collections import namedtuple, defaultdict

state_change = namedtuple("state_change", ["event", "phase", "datetime"])

sql = """
SELECT *
FROM job_history
WHERE job = 'job_name'"""

# Now we need to assosciate job states, and times.
jobs = defaultdict(list) # Key is the job id, list of state changes

for row in get_media_scan_data(sql):
    jobs[row[7]].append(state_change(
        row[8],
        row[10],
        row[5],))

单独一行看起来像

datetime                job         job_id  event               impact_policy   phase
2000-06-10 08:44:04.000 job_name    4165    begin inode verify  NULL            4

这个问题的一个解决方案是对 window 数据进行计算。所以说前 200,000 行,然后做 200,001 到 400,000,等等

是否有更高效的内存方式在本地存储此数据? 如果我可以避免重新下载数据集(使用 windows) 多次。

拥有数十亿行,您显然需要某种磁盘持久性。看看 bsddb 模块,它是一个非常快速的嵌入式 key-value 商店。 一个小例子(注意在 python 3 上存储值的一种奇怪方式):

import bsddb3.db as db
def bsdtest():
    d = db.DB()
    d.open('test.db', dbtype=db.DB_HASH, flags=db.DB_CREATE)
    # d.exists()
    for key in range(1000000):
        d.put(bytes(str(key), encoding='ascii'), 
              bytes(str('value'), encoding='ascii'))
    d.close()