17

いくつかのオブジェクトを監視することに興味があります。15 分ごとに約 10000 のデータ ポイントを取得できると予想しています。(最初はそうではないかもしれませんが、これは「一般的な球場」です)。また、日次、週次、月次、年次の統計を取得できるようにしたいと考えています。データを最高解像度 (15 分) で 2 か月以上維持することは重要ではありません。

私はこのデータを保存するさまざまな方法を検討しており、従来のリレーショナル データベースまたはスキーマレス データベース (SimpleDB など) を検討しています。

私の質問は、これを行うための最良の方法は何ですか? 私は、独自の高価なソリューションよりも、オープンソース (および無料) のソリューションを非常に好みます。

小さなメモ: このアプリケーションは Python で作成しています。

4

5 に答える 5

11

h5pyまたはPyTablesを介してアクセスできるHDF5は、非常に大きなデータ セットを処理するために設計されています。どちらのインターフェースもうまく機能します。たとえば、h5py と PyTables の両方に自動圧縮機能があり、Numpy をサポートしています。

于 2009-08-26T14:16:43.177 に答える
8

Tobi Oetikerによる RRDTool です。これはオープンソースであり、まさにそのようなユースケース向けに設計されています。

編集:

いくつかのハイライトを提供するには: RRDTool は時系列データをラウンドロビン データベースに格納します。生データを一定期間保持し、構成可能な方法で圧縮するため、たとえば 1 か月間のきめ細かいデータ、過去 6 か月間の 1 週間の平均データ、最後の 1 か月間の平均データが得られます。 2年。副作用として、データベースは常に同じサイズのままです(そのため、ディスクがいっぱいになることはありません)。こちらは収納面でした。検索側では、RRDTool は、ドキュメントや Web ページに簡単に含めることができるグラフ (png など) にすぐに変換されるデータ クエリを提供します。これは、その前身である MRTG よりもはるかに一般化された形式である、堅実で実績のあるソリューションです (これについて聞いたことがある人もいるかもしれません)。そして、一度慣れると、何度も何度も再利用していることに気付くでしょう。

簡単な概要と RRDTool の使用者については、こちらも参照してください。作成できるグラフィックの種類を知りたい場合は、ギャラリーをご覧ください。

于 2009-08-26T14:29:48.240 に答える
1

これはかなり標準的なデータウェアハウスです。

いくつかの次元によって編成された多くの「事実」。そのうちの1つは時間です。たくさんの集約。

多くの場合、それに基づく単純な集計アルゴリズムを使用して処理する単純なフラットファイルは、defaultdict高速で単純な驚異的な動作をします。

7.300.000.000行を効率的に保存する方法をご覧ください

大容量のデータベースにデータベースを選択しますか?

于 2009-08-26T16:52:11.607 に答える
1

プレーンテキストファイル?15 分あたり 10,000 のデータ ポイントがバイト単位で何に変換されるかは明確ではありませんが、いずれにせよ、テキスト ファイルは保存、アーカイブ、転送、操作が簡単で、見るだけで直接調べることができます。Python での作業もかなり簡単です。

于 2009-08-26T14:31:07.537 に答える
0

私が書いた、活発に開発中のオープン ソースの時系列データベースがあります (現在は .NET のみ)。大量 (テラバイト) の均一なデータを「バイナリ フラット ファイル」形式で格納できます。すべての使用法はストリーム指向 (順方向または逆方向) です。当社では、株式ティックの保管と分析に積極的に使用しています。

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);
}
于 2012-03-13T14:22:25.043 に答える