Python中的算法用于存储和搜索数千个编号事件的每日事件?

Axi*_*ial 5 python date zodb data-structures

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

这是一个简化的场景:我每天都会记录20万个路灯(标记为sl1到sl200000),显示灯是否在当天运行.灯泡在服务的时间长短只与特定日历日有关.

还为每个灯存储了其他信息,Python类的开头看起来像这样:

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

我的py-foo不太好,我想避免在磁盘/内存存储上太贪心的解决方案.因此,使用(年,月,日)元组字典的解决方案可能是一种解决方案,但我希望能够获得更有效解决方案的指示.

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

sl1000_up = dict('2010': '11100000000000...', '2011':'11111100100...')
Run Code Online (Sandbox Code Playgroud)

跨年度搜索需要合并,闰年是一种特殊情况,而且我需要使用这种自行开发的解决方案来编码/解码.看起来不安静吧.加速位串位操作,如何在列表中查找缺失日期,以及使用位掩码查找数据间隙,我遇到了有趣的帖子.我还调查了python-bitstring并做了一些谷歌搜索,但似乎没有什么真的适合.

另外,我想搜索"差距"是可能的,例如"三天或更长时间不行动",并且标记的日期必须转换为真实的日历日期.

我会很感激想法或指向可能的解决方案.为了进一步增加细节,可能会感兴趣的是使用的后端数据库是ZODB,并且可以被腌制的纯Python对象是首选.

eum*_*iro 5

在Numpy中创建一个2D数组:

import numpy as np

nbLamps = 200000
nbDays = 365

arr = np.array([nbLamps, nbDays], dtype=np.bool)
Run Code Online (Sandbox Code Playgroud)

它将非常节省内存,您可以轻松地聚​​合日期和灯具.

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

  • 值得知道的是,numpy bool存储为整个字节,因此这可能不像看起来那样具有内存效率. (2认同)