gpt4 book ai didi

python - 寻找一种有效的方式来存储历史数据

转载 作者:太空狗 更新时间:2023-10-30 02:57:04 26 4
gpt4 key购买 nike

数据是一个 python 字典,表示随时间缓慢变化的事物的状态。值经常变化,通常一次变化一两个项目。 key 也可以改变,但这是罕见的事件。每次更改后,都会记住新数据集以供将来检查。

结果是一个带有递增时间戳的长序列。一个非常简单的“b”打开和关闭再打开的例子:

(timestamp1, {'a':False, 'b':False, 'c':False}),
(timestamp2, {'a':False, 'b':True, 'c':False}),
(timestamp3, {'a':False, 'b':False, 'c':False}),
(timestamp4, {'a':False, 'b':True, 'c':False}),

这个序列使用起来非常方便,但显然效率很低。几乎相同的数据被一遍又一遍地复制。真正的字典有大约 100 个项目。这就是为什么我正在寻找一种不同的方式来将数据历史记录存储在内存和磁盘上。

我很确定这个问题在过去已经被解决过很多次。 这个问题有什么标准/推荐的方法吗?解决方案不一定是完美的。足够好就足够了。


这就是我会做的,除非有好心人给出更好的方法。仅存储增量更改是节省空间的:

(timestamp1, FULL, {'a':False, 'b':False, 'c':False}),
(timestamp2, INCREMENTAL, {'b':True}),
(timestamp3, INCREMENTAL, {'b':False}),
(timestamp4, INCREMENTAL, {'b':True}),

但是数据并不容易访问,因为它必须从最后一个 FULL 状态通过几个步骤来恢复。为了限制缺陷,每第 N 条记录都将存储为 FULL,所有其他记录将存储为 INCREMENTAL。

我可能会添加这个小改进:添加对已记录的相同状态的引用以防止重复:

(timestamp1, FULL, {'a':False, 'b':False, 'c':False}),
(timestamp2, INCREMENTAL, {'b':True}),
(timestamp3, SAME_AS, timestamp1),
(timestamp4, SAME_AS, timestamp2),

最佳答案

一种更节省空间的方法是为每个“列”数据保留一个集合。也就是说,我们为 abc 列保留一个集合。该集合跟踪列值为 True 的时间戳。例如,对于数据:

(timestamp1, {'a':False, 'b':False, 'c':False}),
(timestamp2, {'a':False, 'b':True, 'c':False}),
(timestamp3, {'a':False, 'b':False, 'c':False}),
(timestamp4, {'a':False, 'b':True, 'c':False}),

a 列的集合将为空,b 列的集合将包含时间戳 2 和 4,c 列的集合> 将再次为空。

请注意,这或多或少是一种存储稀疏二进制向量的方法。我们没有存储整个向量,而是只跟踪向量为 1 的位置。实际上,您可能需要考虑使用来自 SciPy 的稀疏矩阵数据类型。 .

集合提供高效(恒定时间)的成员查找,因此这也是一种省时的方法。

为了使数据易于访问,您可以编写一个包装集合的小类。例如:

class SparseStates(object):

def __init__(self, columns):
self.data = {col: set() for col in columns}

def __getitem__(self, key):
row, column = key
return row in self.data[column]

def turn_on(self, row, column):
self.data[column].add(row)

用法:

>>> states = SparseStates(['a', 'b', 'c'])
>>> states.turn_on(2, 'b')
>>> states.turn_on(4, 'b')
>>> states[2, 'a']
False
>>> states[2, 'b']
True
>>> states.data['a']
{}
>>> states.data['b']
{2, 4}

关于python - 寻找一种有效的方式来存储历史数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38465620/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com