Büyük zaman serisi verilerini verimli bir şekilde nasıl saklayabilirim?


27

Çok büyük miktarlarda zaman serisi verilerini sorgulayabilmem ve sorgulayabilmem gerekiyor.

Verilerin özellikleri aşağıdaki gibidir:

  • dizi sayısı: yaklaşık 12.000 (on iki bin)
  • Dünya genelinde veri noktalarının sayısı: ayda yaklaşık 500.000.000 (beş yüz milyon)
  • karma değer türleri: veri noktalarının çoğu kayan nokta değerleri, geri kalan dizeler
  • örnekleme süresi: seri içinde olduğu gibi seri içinde de değişken
  • zaman damgaları: milisaniye hassasiyetli
  • veri saklama süresi: çürüme veya alt örnekleme olmadan birkaç yıl
  • veri arşivlerinin neredeyse gerçek zamanlı olarak oluşturulması gerekir, ancak makul bir gecikme (~ 1 saat) kabul edilebilir
  • Gerekirse geçmiş veriler yeniden oluşturulabilir, ancak yüksek maliyetle
  • bazen, ancak oldukça nadiren, bazı geçmiş verilerin güncellenmesi gerekir

Öngörülen sorguların özellikleri:

  • verilere karşı sorguların çoğu zaman damgası tabanlı sorgular olacaktır; bir gün ile birkaç ay / yıl arasında değişmektedir. 90% + en son veri sorguları olacak

Diğer gereklilikler:

  • çözelti bedava biradaki gibi serbest olmalıdır ve tercihen açık kaynak olmalıdır

İlk düşüncem, PyTables / Panda'ları HDF5 dosyaları ile bir SQL veritabanı yerine arka uç olarak kullanmaktı.

Sorular:

  1. PyTable'ların / Pandaların "en iyi" yol olduğunu varsayarsak , verileri her biri belirli bir zaman dilimine yayılmış birkaç HDF dosyasına bölmek ya da her şeyi daha sonra devasa olacak tek bir dosyaya koymak daha iyi olur mu?

  2. Gidip sabit formatı mı yoksa tablo formatını mı tercih edeyim? Bana göre, bir HDF dosyasını ayda bir tutarsam sabit format iyi görünüyor, bu şekilde bir dizi muhtemelen RAM'e sığar ve bir tablo formatı endeksine ihtiyaç duymadan bellekte dilimleyebilirim. Doğrumuyum ?

Ve bu en iyi yaklaşım değilse , bu veri deposunu nasıl yapılandırmalıyım veya hangi teknolojileri göz önünde bulundurmalıyım? Büyük zaman serileri verilerini depolayan ilk kişi ben değilim, bu zorluğun çözümü için genel yaklaşım nedir?


Düşündüğüm diğer yaklaşımlar:

  • dizi veritabanları: bunlar sabit örnekleme periyodu olan zaman serileri için mükemmel bir seçimdir, çünkü daha sonra sadece dizinin başlangıç ​​ve bitiş zamanlarını ve örnekleme periyodunu saklamanız gerekir ve ardından dizinin ve indekslemenin sadece değerleri kolaydır. Ancak serinin kendi içindeki değişken örnekleme periyotları ile, benim görüşüme göre DBMS dizisi için bu kadar uygun olmayan bir zaman damgası- değer ilişkisini daha yakından tutmam gerekiyor.
  • zaman damgası, paramID, sütun olarak değere sahip standart SQL veritabanı, ancak yapıları gereği herhangi bir sorgu için çok fazla disk I / O talep ederler.

Dizi veritabanlarını göz önünde bulundurmalısınız - en.wikipedia.org/wiki/Array_DBMS#List_of_Array_DBMS . Onlardan birinin doğru, hatta en iyisi ve hatta yeterince iyi bir cevap olacağını söylemiyorum, sadece düşüncelerinize girmeleri gerekiyor. Bu listedeki girişlerin yanı sıra, ücretsiz olmasına rağmen kdb sistemi ( kx.com ) var.
Yüksek Performanslı Mark

Girişiniz için teşekkür ederim. Dizi veritabanlarını dikkate aldım ancak bunlarla karşılaştığım konu, sabit örnekleme periyodu olan zaman serileri için mükemmel bir uyum olması , çünkü daha sonra yalnızca dizinin başlangıç ​​ve bitiş zamanlarını ve örnekleme süresini ve ardından yalnızca değerleri dizinin kendisi ve indekslemesi kolaydır. Ancak serinin kendi içindeki değişken örnekleme dönemleri ile , benim görüşüme göre, DBMS dizisi için bu kadar uygun olmayan bir zaman damgası- değer ilişkisini daha yakından tutmam gerekiyor. Bununla birlikte, yanlış olduğumu kanıtlamaktan mutlu olurum.
saat

Ben şimdiye kadar düşündüklerimi eklemek için soru düzenleme
flyingmig

Soru: Tüm verileri saklamanız gerekiyor mu? Veriler zamanla bozulabilir ve / veya şamandıra tabanlı seriler için kabul edilebilir bir hassasiyet düzeyi var mı?
J Trana

1
@ moinuddin-quadri Tablo formatını kullanarak aylık HDF5 dosyaları tarafından desteklenen pandalar DataFrame nesnelerini kullandım. Sistem bir yıldan fazla bir süredir çalışıyor ve SSD diskleri kullanmıyor bile, çok kararlı ve hızlı olduğunu gösteriyor. Vaktim varken bunları bir cevap olarak yazmaya çalışacağım. Başka bana PM için çekinmeyin.
flyingmig

Yanıtlar:


5

Grafit projesinin bir parçası olan karbon ve fısıltıya bakmak isteyebilirsiniz . Karbon çok büyük miktarda zaman serisi verisini kaldırabilir. Buna rağmen, şimdi belgeleri okuduğumda (kullandığımdan beri birkaç yıl geçti), sadece sayısal veriler için. Ayrıca dize verileriniz olduğunu söylemiştiniz, bu yüzden bunu yararlı bulamayabilirsiniz. Yine de, büyük miktardaki verileri hızlı bir şekilde nasıl işleyebildikleri konusunda biraz bilgelik kazanabilirsiniz.

Ne kadar iyi olduğu konusunda bir fikir vermek gerekirse, grafit ilk Orbitz'de üretime girdiğinde, dakikada 160.000 ölçüm gerçekleştiriyordu .


Öneriniz için teşekkür ederim, fakat benim anlayışımdan dolayı fısıltı uymuyor çünkü milisaniye hassasiyetine ihtiyaç duyduğumda kesinliği ikinci sırada yer alıyor ve doğru bir şekilde belirttiğiniz gibi, orada saklanamayan bir dizi veriye sahibim.
Ocak'ta 15:29

1
flyingmig Çok hızlı fısıltı yazmayın. Zaman damgaları Unix-epoch değerleridir. Ve soruda tanımladığınız "string data", enums'lere benziyor ve bunlar genellikle küçük tamsayı değerleri olarak saklanıyor.
Ross Patterson,

Sears, dakikada 4M + benzersiz veri noktalarını saklamak için Carbon / Graphite / Ceres kullanıyor. Mükemmel değil ve grafit kümelemesi ve SSD'ler gerektiriyor, ancak çalışıyor. Buradaki diğer tüm çözümler, bulduğumuz seviyeye kadar ölçeklendirilemez, ancak fikirleriniz varsa, çekinmeyin.
Kevin J. Rice


2

sütun odaklı veritabanlarını kontrol etmek isteyebilirsiniz. Dizi veritabanları ile ne demek istediğinizi tam olarak bilmiyorum ama önerilen yaklaşımımla, zaman dilimi başına dinamik bir değere sahip olabilirsiniz. Aynı zaman damgası için birden fazla değeriniz de olabilir. İlginç olan kısım, eğer aynı zaman damgasında ölçülen değerlere sahipseniz, bunları ilave sütunlar olarak kaydedebilirsiniz (örn. Sıcaklık ve nemi ölçen bir sensör, hisse senedi alım satım fiyatı ve bir işlemin büyüklüğü, ...). Sütun yönelimli doğası nedeniyle, 100 sütunlu tablolara sahip olabilirsiniz, ancak sorgunuz yalnızca beş sütuna erişiyorsa, veritabanı yalnızca beş sütunun verilerini okur.

Kendi zaman serisi veritabanınızı oluşturma hakkında bir seri yazdım, bir göz atmak isteyebilirsiniz:

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.