Saya perlu menyimpan dan dapat meminta beberapa data deret waktu dalam jumlah yang sangat besar.
Properti data adalah sebagai berikut:
- jumlah seri: sekitar 12.000 (dua belas ribu)
- jumlah titik data, secara global: sekitar 500.000.000 per bulan (lima ratus juta)
- tipe nilai campuran: sebagian besar titik data adalah nilai titik mengambang, sisanya adalah string
- periode sampling: variabel antara seri dan juga dalam seri
- cap waktu: presisi milidetik
- periode penyimpanan data: beberapa tahun, tanpa pembusukan atau downsampling
- arsip data harus dibangun dalam waktu dekat, tetapi penundaan yang wajar (~ 1 jam) dapat diterima
- data masa lalu dapat dibangun kembali jika diperlukan, tetapi dengan biaya tinggi
- kadang-kadang, tetapi sangat jarang, beberapa data masa lalu perlu diperbarui
Properti kueri yang dibayangkan:
- sebagian besar kueri terhadap data akan menjadi kueri berbasis timestamp; mulai dari satu hari hingga beberapa bulan / tahun. 90% + akan menjadi pertanyaan pada data terbaru
Persyaratan lainnya:
- solusinya harus gratis seperti dalam bir gratis dan lebih disukai opensource
Pikiran awal saya adalah menggunakan PyTables / Pandaas dengan file HDF5 sebagai menyimpan backend daripada database SQL.
Pertanyaan:
Dengan asumsi PyTables / Pandas adalah rute "terbaik", apakah akan lebih baik untuk membagi data dalam beberapa file HDF, masing-masing mencakup periode waktu tertentu, atau meletakkan semuanya dalam satu file yang kemudian akan menjadi besar?
Haruskah saya memilih format tabel atau tetap? Bagi saya, format tetap terlihat OK jika saya menyimpan satu file HDF per bulan, karena dengan cara ini seluruh rangkaian mungkin sesuai dengan RAM dan saya dapat mengiris dalam memori tanpa perlu indeks format tabel. Apakah saya benar ?
Dan jika itu bukan pendekatan terbaik, bagaimana saya harus menyusun penyimpanan data ini atau teknologi apa yang harus saya pertimbangkan? Saya bukan orang pertama yang menangani penyimpanan set besar data deret waktu, apa pendekatan umum untuk menyelesaikan tantangan ini?
Pendekatan lain yang saya pertimbangkan:
- database array: mereka sangat cocok untuk deret waktu dengan periode pengambilan sampel konstan, karena Anda hanya perlu menyimpan waktu mulai dan akhir dan periode pengambilan sampel array, dan kemudian hanya nilai-nilai dalam array itu sendiri dan pengindeksan mudah. Tetapi dengan periode pengambilan sampel variabel dalam seri itu sendiri, saya perlu menjaga hubungan nilai timestamp-> lebih dekat, yang dalam pandangan saya tidak cocok untuk array DBMS.
- database SQL standar dengan timestamp, paramID, nilai sebagai kolom tetapi berdasarkan sifatnya mereka meminta banyak disk I / O untuk setiap permintaan
sumber
Jawaban:
Anda mungkin ingin melihat karbon dan berbisik , bagian dari proyek grafit . Karbon dapat menangani jumlah data deret waktu yang sangat besar. Padahal, sekarang saya membaca dokumen (sudah beberapa tahun sejak saya menggunakannya), itu hanya untuk data numerik. Anda bilang Anda juga memiliki data string sehingga Anda mungkin tidak menemukan ini berguna. Padahal, Anda mungkin dapat memperoleh beberapa kebijaksanaan tentang bagaimana mereka dapat memproses data dalam jumlah besar dengan cepat.
Untuk memberi Anda gambaran tentang seberapa baik skala itu, ketika grafit pertama kali diproduksi di Orbitz, ia menangani 160.000 metrik per menit .
sumber
InfluxDB adalah database sumber terbuka yang ditulis dalam Go. Ini telah ditulis terutama untuk menangani data deret waktu, dan mereka menerbitkan tolok ukur yang menunjukkan kinerja yang jauh lebih baik vs Cassandra :
sumber
Anda mungkin ingin checkout database berorientasi kolom. Saya tidak yakin apa yang Anda maksud dengan database array tetapi dengan pendekatan yang saya sarankan Anda dapat memiliki jumlah nilai dinamis per kerangka waktu. Anda juga dapat memiliki beberapa nilai untuk cap waktu yang sama. Bagian yang menarik adalah bahwa jika Anda memiliki nilai yang diukur pada stempel waktu yang sama Anda dapat menyimpannya sebagai kolom tambahan (misalnya sensor yang mengukur suhu dan kelembaban, dalam harga perdagangan saham dan ukuran perdagangan, ...). Karena sifatnya yang berorientasi kolom, Anda dapat memiliki tabel dengan 100 kolom, tetapi jika kueri Anda hanya mengakses lima kolom, basis data hanya akan membaca data dari lima kolom.
Saya menulis seri tentang membuat basis data time series Anda sendiri, Anda mungkin ingin melihatnya:
sumber