我有一系列问题,我希望无需使用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),那将节省大量时间。
答案 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()