簡體   English   中英

在一段時間內返回數​​據樣本的最佳方法是什么?

[英]What's the best way to return a sample of data over the a period?

假設我有一個包含 3600 個文檔的集合——過去一小時每秒一個——每個文檔都有兩個字段: timestampvalue

選擇此數據樣本(例如 12 個文檔,間隔 5 分鍾)的最佳(閱讀:最高性能)方法是什么? 還是 60 個文檔,每分鍾一個?

實際上,這個集合會有幾千萬條記錄,而且查詢會經常運行,所以性能真的很關鍵。 使用兩個字段上的索引,按timestamp > {one hour ago}過濾的查詢在具有 200,000 條記錄的集合上相對較快。

這篇文章已經通過在 ArangoDB 中在一段時間內從大型數據集中聚合平均步數來獲得成功。

我會這樣做:

FOR doc IN Samples
FILTER doc.timestamp > @start AND doc.timestamp < @end
FILTER FLOOR(doc.timestamp/1000) % 300 == 0
RETURN doc

timestamp被假定為基於毫秒的 Unix 時間戳,就像DATE_NOW()函數返回的一樣。

其中@start是周期的開始時間戳, @end end 是周期的結束。

以上返回時間段內每 5 分鍾時間片的第一個文檔。 如果您想要每分鍾一次,請將公式中的300更改為60 如果您想要的不是第一個文檔,而是該時間片開始后 X 秒的文檔,您也可以將0更改為其他值。

可以幫助提高速度的一件事是,如果您將時間戳存儲在基於秒的 Unix 時間戳中,因為這樣公式可能會更簡單: doc.timestamp % 300 == 0每個文檔需要更少的計算。

正如評論中提到的,在timestamp上使用永久索引,這將顯着加快第一個過濾器行。

對此的簡短回答是:

LET steps = 24
LET stepsRange = 0..23
LET diff = @end - @start
LET interval = diff / steps

FOR step IN stepsRange
RETURN FIRST(
    LET stepStart = start + (interval * step)
    LET stepEnd = stepStart + interval

    RETURN FIRST(
        FOR f IN filteredObservations
        FILTER f.timestamp >= stepStart AND f.timestamp <= stepEnd
        COLLECT AGGREGATE temperature = AVG(f.temperature)
        RETURN temperature
    )
)

有關更多詳細信息,請參閱我的問題中的答案並取代了這個: https ://stackoverflow.com/a/72886996/1138620

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM