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对象是首选.
在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对象访问日期.