2011-01-19 2 views
5

私は、多数のアイテムのイベント発生の履歴記録を保存して照会するソリューションを検討しています。何千もの番号付きイベントの毎日の出現を格納および検索するPythonのアルゴリズムですか?

これは簡単なシナリオです:私はランプがその日に稼動していたかどうかを示す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つの解決策になるかもしれませんが、私はより効率的な解決策の指針を得ることを望んでいます。

レコードは、ランプ2010の最初の3日間の動作であった場合、記録が可能であり、したがって月1から始まる年の日を表す各ビットを持つビットストリームとして格納することができます

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日以上の行動から外れた」ということであり、フラグされた1日を実際のカレンダーの日付に変換することが不可欠です。

私は可能な解決策のアイデアや指針をいただきたいと思います。詳細を追加するには、使用されるバックエンドDBがZODBであり、ピクルされる純粋なPythonオブジェクトが優先されることが重要です。

答えて

5

numpyの中の2Dアレイを作成します。

import numpy as np 

nbLamps = 200000 
nbDays = 365 

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

それは非常にメモリ効率となり、あなたは簡単に日やランプを集約することができます。

さらに日数を操作するには、scikits.timeseriesをご覧ください。それらはdatetimeオブジェクトで日付にアクセスすることができます。

+0

scikits.timeseriesを指摘してくれてありがとうございます。私がしなければならない分析の大部分を支えているようです。インスタンス化されたオブジェクトに1つのランプのレコードを格納するので、すべてのランプを1つの配列に1年間格納することは可能ではありません。しかし、これは適応が容易でなければならず、私はホイールを再構成するトップを持っていません。 Pythonのnoobだけがこのパッケージを見落とす可能性があります;-) – Axial

+2

numpyのブールがバイト全体として格納されていることは分かりますので、これはメモリのように効率的ではないかもしれません。 –

0

私はおそらくランプを辞書し、それぞれに状態変化のリストが含まれるようにします。最初の要素は変更の時間であり、2番目の値はその時から有効な値です。

このようにして、次のサンプルを取得すると、最後の項目と比較して状態が変更されていない限り、何もしません。

検索は、時代のバイナリ検索アプローチを使用することができるので、迅速かつ効率的です。

持続性もあり、既存の実行中のシステムに問題なくデータを追加することができます。また、ランプ状態の辞書を辞書に追加することで、リソース使用率をさらに削減できます。

ギャップを検索する場合は、すべての項目を調べて、次の時間と以前の時間を比較します。また、状態リストを辞書に入れることを決めた場合は、異なるごとに1回だけ行うことができますすべてのランプではなくリストを表示し、同じ「オフライン」状態のすべてのランプを取得して、時には役立つことがある1回の繰り返しで表示します。

+0

ありがとう!私はこのソリューションが簡単に拡張できるのが好きです。レコードはうまく格納できます。それでも、私はすでにpylandに存在するかもしれない足場を書く必要があります(おそらく、いくつかの科学的データ処理モジュール)。 – Axial

関連する問題