2

約 500 個のセンサーがあり、それぞれ約 1 分に 1 回値を出力します。センサーの値は、次の値が出力されるまで一定のままであると想定できるため、時系列が作成されます。センサーは、いつデータを送信するかという点では同期されませんが (そのため、観測のタイムスタンプは異なります)、すべてが一元的に収集され、センサーごとに保存されます (センサーのサブセットによるフィルタリングを可能にするため)。

センサーからのデータの合計を示す集計時系列を作成するにはどうすればよいですか? n (1 日の一連の観測で時系列を作成する必要があるため、1 日あたり 24x60x500 の観測を考慮する必要があります)。計算も高速である必要があり、できれば 1 秒未満で実行する必要があります。

例 - 生の入力:

q)n:10
q)tbl:([]time:n?.z.t;sensor:n?3;val:n?100.0)
q)select from tbl
time         sensor val
----------------------------    
01:43:58.525 0      33.32978
04:35:12.181 0      78.75249
04:35:31.388 0      1.898088    
02:31:11.594 1      16.63539
07:16:40.320 1      52.34027
00:49:55.557 2      45.47007
01:18:57.918 2      42.46532
02:37:14.070 2      91.98683
03:48:43.055 2      41.855
06:34:32.414 2      9.840246

私が探している出力には、同じタイムスタンプとセンサー全体の合計が表示されます。一致するタイムスタンプで定義されたレコードがセンサーにない場合は、以前の値を使用する必要があります (レコードは、センサーからの出力が変化したときの時間を示すだけです)。

時間でソートされた期待される出力

time         aggregatedvalue
----------------------------    
00:49:55.557   45.47007  / 0 (sensor 0) + 0 (sensor 1) + 45.47007 (sensor 2)
01:18:57.918   42.46532  / 0 (sensor 0) + 0 (sensor 1) + 42.46532 (new value on sensor 2)
01:43:58.525   75.7951   / 33.32978 + 0 + 42.46532
02:31:11.594   92.43049  / 33.32978 + 16.63539 + 42.46532
02:37:14.070   141.952   / 33.32978 + 16.63539 + 91.98683
03:48:43.055   91.82017  / 33.32978 + 16.63539 + 41.855
04:35:12.181   137.24288 / 78.75249 + 16.63539 + 41.855
04:35:31.388   60.388478 / 1.898088 + 16.63539 + 41.855   
06:34:32.414   28.373724 / 1.898088 + 16.63539 + 9.840246 
07:16:40.320   64.078604 / 1.898088 + 52.34027 + 9.840246
4

2 に答える 2

0

レコードは時間順に入ってくると想定しているため、tbl は時間順にソートされます。そうでない場合は、最初にテーブルを時間順に並べ替えます。

d は各時刻のセンサー別の最終価格の辞書です。以下のソリューションはおそらく最もエレガントではなく、それぞれを必要としないよりパフォーマンスの高い方法が利用できると想像できます。

q)d:(`long$())!`float$()
q)f:{d[x]::y;sum d} 
q)update agg:f'[sensor;val] from tbl
time         sensor val      agg     
-------------------------------------
00:34:28.887 2      53.47096 53.47096
01:05:42.696 2      40.66642 40.66642
01:26:21.548 1      41.1597  81.82612
01:53:10.321 1      51.70911 92.37553
03:42:39.320 1      17.80839 58.47481
05:15:26.418 2      51.59796 69.40635
05:47:49.777 0      30.17723 99.58358
11:32:19.305 0      39.27524 108.6816
11:37:56.091 0      71.11716 140.5235
12:09:18.458 1      78.5033  201.2184

720k レコードのデータ セットは比較的小さいため、集計は 1 秒未満である必要があります。何日にもわたるデータを保存する場合は、ここで概説されているいくつかの手法 (スプレイ、パーティショニングなど) を検討することをお勧めします。

于 2013-05-03T19:39:19.047 に答える