2009-08-26 84 views
17

我對監視某些對象感興趣。我預計每15分鐘將獲得約10000個數據點。 (也許不是一開始,但這是'一般的球場')。我還希望能夠獲得每日,每週,每月和每年的統計數據。保持數據的最高分辨率(15分鐘)超過兩個月並不重要。存儲時間序列數據的最佳開源解決方案是什麼?

我正在考慮各種方式來存儲這些數據,並一直在尋找一個經典的關係型數據庫,或在無模式的數據庫(如SimpleDB的)。

我的問題是,什麼是沿着這樣做最好的方法去?我非常希望開源(和免費)解決方案的專有昂貴。

小記:我在Python寫這個申請。

+0

您可能正在尋求某種形式的合併方案。你可能會發現在這個相關的問題的討論有幫助:http://stackoverflow.com/questions/1248815/percentiles-of-live-data-capture/1249003#1249003 – 2009-08-26 13:56:12

回答

11

HDF5,它可以通過h5pyPyTables訪問,是專爲處理非常大的數據集。兩個接口都工作正常。例如,h5py和PyTables都具有自動壓縮功能並支持Numpy。

+0

這似乎很有趣,我會檢查出來。 – lorg 2009-08-26 15:53:50

8

RRDTool由託比歐梯克,絕對!它是開源的,它是專門爲這種用例設計的。

編輯:

提供幾個亮點:RRDTool的存儲時間序列數據在一個循環的數據基礎。它將原始數據保存一段時間,然後以可配置的方式進行濃縮,這樣您就可以得到一個月的細粒度數據,過去6個月的平均數據超過一週,而最後一個月的平均數據超過一個月2年。作爲一個副作用,你的數據庫在所有的時間都保持相同的大小(所以沒有出汗你的磁盤可能會滿)。這是存儲方面。在檢索方RRDTool提供的數據查詢可立即轉化爲圖形(例如png),您可以隨時將其包含在文檔和網頁中。這是一個堅如磐石,經過驗證的解決方案,相對於其前身MRTG而言是一種非常普遍的形式(有些人可能聽說過這個)。而一旦你進入它,你會發現自己重複使用它一遍又一遍。

快速瞭解以及誰在使用RRDTool的,也here見。如果你想看看你可以製作哪種圖形,請確保你看看gallery

+0

我知道RRDTool,對它進行另一次「投票」是件好事。我會更深入地研究它。另外,你知道你是否可以在Python中與它進行交互? – lorg 2009-08-26 15:55:27

+0

@lorg我自己沒有嘗試過,但文檔明確列出了Python綁定(http://oss.oetiker.ch/rrdtool/prog/rrdpython.en.html) – ThomasH 2009-08-26 15:58:00

+0

它有Python綁定。但是最近一次(很久以前),他們的表現並不好。我最終只是用像這個類一樣的子進程調用來包裝CLI:http://code.google.com/p/perfmetrics/source/browse/trunk/lib/rrd.py – 2009-08-26 16:09:18

1

純文本文件?目前還不清楚每15分鐘的10k數據點在字節方面的轉化,但無論如何,文本文件更容易存儲/存檔/傳輸/操作,您可以直接查看,直接查看。使用Python也相當容易。

0

有正在積極開發的開源數據庫的時間序列(.NET現在只),我寫的。它可以以「二進制平面文件」方式存儲大量(terrabytes)統一數據。所有用法都是面向流的(正向或反向)。我們積極將其用於我公司的股票蜱儲存和分析。

https://code.google.com/p/timeseriesdb/

// Create a new file for MyStruct data. 
// Use BinCompressedFile<,> for compressed storage of deltas 
using (var file = new BinSeriesFile<UtcDateTime, MyStruct>("data.bts")) 
{ 
    file.UniqueIndexes = true; // enforces index uniqueness 
    file.InitializeNewFile(); // create file and write header 
    file.AppendData(data); // append data (stream of ArraySegment<>) 
} 

// Read needed data. 
using (var file = (IEnumerableFeed<UtcDateTime, MyStrut>) BinaryFile.Open("data.bts", false)) 
{ 
    // Enumerate one item at a time maxitum 10 items starting at 2011-1-1 
    // (can also get one segment at a time with StreamSegments) 
    foreach (var val in file.Stream(new UtcDateTime(2011,1,1), maxItemCount = 10) 
     Console.WriteLine(val); 
} 
相關問題