使用namedtuples的dict在Python中耗尽内存

时间:2016-01-12 05:06:29

标签: python out-of-memory

我有一系列问题,我希望无需使用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

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

是否有更节省内存的方法在本地存储此数据?如果我可以避免多次重新下载数据集(使用Windows),那将节省大量时间。

1 个答案:

答案 0 :(得分:1)

有了数十亿行,你显然需要某种磁盘持久性。看看bsddb模块,它是一个非常快速的嵌入式键值存储。 一个很小的例子(注意在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()