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 はあまり良くないので、ディスク/メモリ ストレージに貪欲すぎるソリューションは避けたいと思います。したがって、(年、月、日) タプルの dict を使用したソリューションは 1 つのソリューションになる可能性がありますが、より効率的なソリューションへのポインターを取得したいと考えています。

レコードは、ビット ストリームとして保存され、各ビットは 1 月 1 日から始まる 1 年の日付を表します。したがって、ランプが 2010 年の最初の 3 日間動作していた場合、レコードは次のようになります。

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

年の境界を越えた検索にはマージが必要です。閏年は特別なケースです。さらに、この自家製のソリューションを使用してかなりの量をコーディング/デコードする必要があります。静かではないようです。speed-up-bitstring-bit-operationshow-do-i-find-missing-dates-in-a-listfinding-data-gaps-with-bit-maskingで興味深い投稿を見つけました。私もpython-bitstringを調べてグーグルで調べましたが、本当に合うものはないようです。

さらに、「3 日以上休業」などの「ギャップ」を検索できるようにしたいと考えています。

考えられる解決策へのアイデアや指針をいただければ幸いです。さらに詳細を追加すると、使用されるバックエンド DB が ZODB であり、ピクルできる純粋な Python オブジェクトが優先されることが興味深い場合があります。

4

2 に答える 2

5

Numpy で 2D 配列を作成します。

import numpy as np

nbLamps = 200000
nbDays = 365

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

これは非常にメモリ効率が良く、日とランプを簡単に集計できます。

日をさらにうまく操作するには、scikits.timeseriesを見てください。日時オブジェクトを使用して日付にアクセスできます。

于 2011-01-19T11:24:59.640 に答える
0

私はおそらくランプをディクショナリし、それぞれに状態変化のリストを含めます。最初の要素は変化の時間であり、2 番目の要素はその時間から有効な値です。

このようにして、次のサンプルに到達したときに、状態が最後のアイテムと比較して変化しない限り、何もしません。

時間に二分探索アプローチを使用できるため、検索は迅速かつ効率的です。

永続化も簡単で、既存の実行中のシステムに問題なくデータを追加したり、ランプの状態リストをディクショナリ化してリソースの使用量をさらに削減したりできます。

ギャップを検索したい場合は、すべてのアイテムを調べて、次の時間と前の時間を比較するだけです。状態リストを辞書化することにした場合は、すべてのリストではなく、異なるリストごとに 1 回だけ実行できます。ランプを取得し、同じ「オフライン」状態のすべてのランプを 1 回の繰り返しで取得します。

于 2011-01-19T14:52:02.370 に答える