5

我正在研究存储和查询大量项目的事件发生历史记录的解决方案。

这是简化的场景:我每天收到 200 000 盏路灯(标记为 sl1 到 sl200000)的日志,它显示了该灯是否在当天运行。灯使用多长时间无关紧要,只要它是在给定的日历日。

还为每个灯存储了其他信息位,Python 类的开头如下所示:

class Streetlamp(object):
    """Class for streetlamp record"""
    def __init__(self, **args):
        self.location = args['location']
        self.power = args['power']
        self.inservice = ???

我的 py-foo 不太好,我想避免在磁盘/内存存储上过于贪婪的解决方案。因此,具有(年、月、日)元组的解决方案可能是一种解决方案,但我希望获得更有效解决方案的指针。

记录可以存储为比特流,每个比特代表从 1 月 1 日开始的一年中的一天。因此,如果灯在 2010 年的前三天运行,那么记录可以是:

sl1000_up = dict('2010': '11100000000000...', '2011':'11111100100...')

跨年份搜索需要合并,闰年是一个特例,另外我需要使用这个本土解决方案进行编码/解码。好像不太安静吧。speed-up-bitstring-bit-operationshow-do-i-find-missing-dates-in-a-list和find -data-gaps-with-bit-masking我遇到的有趣帖子。我还调查了python-bitstring并进行了一些谷歌搜索,但似乎没有什么真正适合。

此外,我希望搜索“间隙”成为可能,例如“停工三天或更长时间”,并且必须将标记的日期转换为真实的日历日期。

我将不胜感激可能的解决方案的想法或指示。要添加更多细节,可能会感兴趣的是使用的后端数据库是 ZODB,并且首选可以腌制的纯 Python 对象。

4

2 回答 2

5

在 Numpy 中创建一个二维数组:

import numpy as np

nbLamps = 200000
nbDays = 365

arr = np.array([nbLamps, nbDays], dtype=np.bool)

它将非常节省内存,您可以轻松地汇总日期和灯。

为了更好地操纵日子,请查看scikits.timeseries。它们将允许您使用 datetime 对象访问日期。

于 2011-01-19T11:24:59.640 回答
0

我可能会对灯进行字典,并让它们中的每一个都包含一个状态更改列表,其中第一个元素是更改的时间,第二个元素是从那时起有效的值。

这样,当您到达下一个样本时,您什么也不做,除非与上一个项目相比状态发生了变化。

搜索快速而高效,因为您可以随时使用二进制搜索方法。

坚持它也很容易,您可以毫无问题地将数据附加到现有和正在运行的系统中,以及对灯状态列表进行字典以进一步减少资源使用。

如果你想搜索一个差距,你只需检查所有项目并比较下一个和上一个时间 - 如果你决定对状态列表进行字典化,那么你将能够为每个不同的列表执行一次,而不是每个灯,然后通过一次迭代获得所有具有相同“离线”状态的灯,这有时可能会有所帮助

于 2011-01-19T14:52:02.370 回答