2013-05-03 5 views
2

나는 분당 약 1 회 값을 방출하는 약 500 개의 센서가 있습니다. 다음 값이 방출 될 때까지 센서 값이 일정하게 유지되므로 시계열을 생성한다고 가정 할 수 있습니다. 센서는 데이터를 방출하는 시점에서 동기화되지 않으므로 (관찰 타임 스탬프가 달라 지므로) 모두 중앙에서 수집되어 센서별로 저장됩니다 (센서의 하위 집합을 기준으로 필터링 할 수 있음).센서에서 timeseries 집계

센서의 데이터 합계를 제공하는 총 시계열을 어떻게 만들 수 있습니까? n (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 

답변

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 초 미만이어야합니다. 여러 날의 데이터를 저장하는 경우 기술 (스플레이, 파티셔닝 등) 중 일부는 here으로 설명 할 수 있습니다.

+0

빠른 답장을 보내 주셔서 감사합니다.하지만 제대로 출력되지는 않습니다. 질문을 예상 출력으로 업데이트했습니다. 나는 약 3 년 분의 데이터를 가지고 있으므로, splaying/partitioning을 살펴볼 필요가있다. –

+0

방금 ​​내 대답을 업데이 트되었습니다. 제가 언급했듯이, 아마 벡터 형태로 이것을하는 더 효율적인 방법이 있습니다. – user1895961

+0

그래, 그게 옳은 결과를 준다. 불행히도 도착 순서가 보장되지 않습니다 (대략적인 시간 주문 만). –

0

나는 이걸로 많은 시간을 보냈다. 큰 배치가 있고 특정 간격으로 선형 보간 계산을 수행하고이 데이터를 저장 한 후에는 되돌아가는 것이 도움이됩니까? 시간에 따라 정렬 된 센서 데이터를 처리했지만 센서는 데이터가 실제로 변경 될 때만 데이터를 보냅니다. 보고 및 기타 계산을 가속화하기 위해 실제로 특정 기간 (예 : 1 초, 30 초, 1 분)의 데이터를 집계하며 평균적으로 평균을 수행합니다. 이 작업을하는 동안 선형 보간도 수행합니다.

단점은 추가 저장 공간이 필요하다는 것입니다. 그러나 성능 향상은 중요합니다.

이미 훌륭한 해결책이있는 것으로 보입니다.