Büyük bir sensör dizisinden veri örnekleri depolamak için bir çözüm (app ve db) uygulamak için görev. Dizi şu anda yaklaşık 20.000 sensörden oluşuyor, ancak yakında 100.000 sensöre kadar büyüyecek. Her sensör her 10 saniyede bir veri örneği gönderir ve her örnek 28 bayt boyutundadır.
Böylece toplamların yapılması aşağıdakilere yol açar:
- Sensör başına günde 8640 numune
- Günde sensör başına 242kB veri
- Günde 864 milyon örnek
Şimdi veri depolamak / almak için en iyi yol ne olacağını merak ediyordum? Yazılım zaten belirtildikten sonra bu projeye "katıldım", bu yüzden SQL Server kullanarak bir Windows Platformunda uygulanması gerekiyor.
Kafamdaki mevcut çözüm, veri örneklerini saklamak için iki tablo içeren bir DB oluşturmaktır. Birincisi, harmanlanmış örnekleri sensör başına günlük olarak ikili bir alanda saklayan ikinciye bir tür dizin görevi görür:
Table 1:
RecordID - BigInt - Identity
SensorID - BigInt - Primary Key
Date - DateTime - Primary Key (yyyy-mm-dd)
Table 2:
RecordID - BigInt - Primary Key (from an insert into Table 1)
Data - Binary
Temel olarak tüm sensörlerden gelen örnekleri geçici dosyalara yazacağım (sensör başına 1). Her günün sonunda Tablo 1'de bir girdi oluşturacağım, oluşturulan RecordID'yi kullanacağım ve dosyayı Tablo 2'deki Veri alanına dökeceğim.
Bu şekilde, tabloya günde 864 milyon giriş yerine yalnızca 100.000 giriş ekledim. Veriler LAN veya Yüksek Hızlı WAN üzerinde mevcut olmalıdır, bu nedenle sensör verilerinin tüm gün bazında alınması kabul edilebilir.
Tüm verilerin saklanması gerekmesine rağmen, büyük olasılıkla hiçbir zaman okunmayacaktır. Bu nedenle, tablo (lar) daki okuma miktarı, yazımlardan çok fazla olmayacaktır.
Ben sadece veri dosyalarının yolunu depolayarak dosya sistemini kullanarak bir şey uygulamak biliyorum, ama ikili alanları daha az 256kB ise SQL Server NTFS daha iyi olduğunu okudum. (256 KB ve 1 MB arasında gri bir alan bulunurken NTFS,> 1 MB ikili boyutlar için SQL Server'dan daha iyi performans gösterir).
Ayrıca 100.000 sensörden gelen verileri kendi dosyalarına, bir klasörde çok miktarda dosyaya sahip olarak veya her klasörde birkaç dosya içeren karmaşık bir ağaç yapısına sahip olarak dosya sisteminde sorunlara neden olmadan saklamaktan biraz sakınıyorum. dosya parçalanmasını bile hesaba katar.
Yukarıdakiler hakkında bana pratik tavsiyeler / yorumlar sunabilir mi?
Düşeceğim bariz tuzaklar var mı?
Örnek veriler oldukça iyi sıkıştırılır. 242 kB'lik bir dosya yaklaşık 85kB'a kadar sıkıştırır. Ancak, örnek verilerin (sütun) otomatik olarak sıkıştırılması için veritabanı düzeyinde bir tür sıkıştırma uygulayabilir miyim?
SQL Server bu proje için açıkça yanlış bir seçim mi?
İki tablonun tasarımım akıllıca mı, yoksa iki tablonun hala "performans" olacağı tek bir tabloda birleştirebilir miyim?