运行 在 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()
我有一组问题,我希望能够在不使用 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()