我是一名機械工程研究生,我的顧問剛要我爲我們的一個傳感器項目編寫數據可視化工具。由於是夏天,他希望我可以有一些樂趣,所以我認爲現在是學習科學計算語言的好時機,所以我繼續前進,並且投入到F#中。你如何在F#中解決這個問題? (高頻傳感器數據)
由於我是新的函數式編程範例,我在構建我的程序時遇到了一些困難,尤其是考慮到可以輕鬆地將FO中的OO/FP結合起來。我的任務如下:
- 我們有幾十個傳感器不斷報告數據(每隔幾秒鐘一次)。
- 我需要同時連接所有傳感器,創建每個傳感器輸出的內存時間序列,然後實時計算這些時間序列的各種統計數據。
- 每隔幾個小時,我需要將數據刷新到二進制文件中以用於日誌記錄。
我應該如何設計我的應用程序?我想過這樣的事情: 1.我打算連接到每個傳感器以開始接收數據,然後將這些數據轉儲到消息隊列中。 2.我會有一個事件驅動的處理函數接收隊列中的數據。當收到數據時,會確定數據來自哪個傳感器,然後將數據放入相應傳感器的時間序列對象中。 3.每當傳感器數據時間序列對象被添加時,我都可以觸發事件並讓我的統計功能爲傳感器收集新數據。
顯然我需要在這個應用程序中保持某種狀態。所以我會添加下面的可變數據結構。我會使用一個通用的.NET可調整大小的List來存儲我的時間序列數據,並實現一個新的派生方法來觸發數據添加事件。我可以在一個Dictionary中存儲sensorid和實際時間序列容器之間的映射(當數據從隊列中彈出時,我可以讀取sensorid字段,獲取該sensorid的時間序列容器,然後輕鬆添加新數據)。我還可以有第二個字典來存儲sensorid和各個時間序列之間的映射,這些時間序列包含感應時間序列的統計信息)。當添加主傳感器時間序列時,它會觸發一個事件來調用所有統計函數,以便在新數據上自行運行,並將其信息存儲在該傳感器ID的適當字典中。
我還沒有想過如何保存數據,但我想我可以用數據寫出二進制文件。
任何意見,想法或參考表示讚賞。
謝謝:)
傳感器陣列的接口是什麼樣的?你會收到一個輸入的傳感器事件流,還是來自每個傳感器的流?我認爲這是即時的(例如顯示最後一分鐘或某些類似的滑動窗口移動平均值),所以您需要不斷更新計算的統計數據? – Brian 2009-05-30 00:19:23
傳感器時間序列對象(可調整大小的數組) - 它只是帶有onadd事件的List。不,我從每個傳感器獲取流,這就是爲什麼我要說我需要彙總這些數據並將其放在隊列中以便於消耗/處理。是的,可視化是實時的,計算的統計數據也需要實時更新。 – 2009-05-30 00:35:02