多数のアイテムのイベント発生の履歴レコードを格納およびクエリするソリューションを調査しています。
これは単純化されたシナリオです。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 はあまり良くないので、ディスク/メモリ ストレージに貪欲すぎるソリューションは避けたいと思います。したがって、(年、月、日) タプルの dict を使用したソリューションは 1 つのソリューションになる可能性がありますが、より効率的なソリューションへのポインターを取得したいと考えています。
レコードは、ビット ストリームとして保存され、各ビットは 1 月 1 日から始まる 1 年の日付を表します。したがって、ランプが 2010 年の最初の 3 日間動作していた場合、レコードは次のようになります。
sl1000_up = dict('2010': '11100000000000...', '2011':'11111100100...')
年の境界を越えた検索にはマージが必要です。閏年は特別なケースです。さらに、この自家製のソリューションを使用してかなりの量をコーディング/デコードする必要があります。静かではないようです。speed-up-bitstring-bit-operations、how-do-i-find-missing-dates-in-a-list、finding-data-gaps-with-bit-maskingで興味深い投稿を見つけました。私もpython-bitstringを調べてグーグルで調べましたが、本当に合うものはないようです。
さらに、「3 日以上休業」などの「ギャップ」を検索できるようにしたいと考えています。
考えられる解決策へのアイデアや指針をいただければ幸いです。さらに詳細を追加すると、使用されるバックエンド DB が ZODB であり、ピクルできる純粋な Python オブジェクトが優先されることが興味深い場合があります。