हम चल रहे हैं, एक डेटाबेस समर्थित वेब अनुप्रयोग के लिए डेटा विश्लेषण, वर्तमान के आधार पर C#.NET के साथ EntityFramework सर्वर पर है, और मुख्य रूप से HTML+जावास्क्रिप्ट चौखटे ग्राहक पक्ष पर (वेब आधारित).
हमारे नियमित रूप से आवेदन प्राप्त करता है माप X/Y datapoints batched बड़ी मात्रा में, यानी 1e6 या उससे अधिक है, उपयोगकर्ताओं द्वारा अपलोड की गई या प्राप्त द्वारा अन्य बुनियादी सुविधाओं.
वर्तमान में हम एक तालिका में MSSQL कहा जाता है Values
के साथ id, series_id as int; x, y, z as float
. इस तालिका में है BULK INSERT
डेटा से भरा एक ग्राहक इसे अपलोड, और संबद्ध मेटाडेटा में सहेजा गया है एक Series
तालिका. कुल db आकार वर्तमान में आ 1TB, 99.99% है, जो की Values
डेटा.
इस दृष्टिकोण था लागू करने के लिए सरल लेकिन यह कई कमियां है जो इसे बनाया है, जटिल और धीमी गति से समय के साथ:
- हम सम्मिलित करने के लिए, मात्रा में करने के लिए अधिभार नहीं IIS प्रक्रिया है जो preprocesses यह (वर्तमान में 200'000 datapoints प्रति खंड)
- IIS प्रक्रिया स्मृति आवश्यकताओं के दौरान सम्मिलित हैं बड़ा (>1500MB के लिए डेटा की 200MB)
- डालने अभी तक बहुत धीमी गति से (5 लाख के रिकॉर्ड कर रहे हैं 100 एमबी, इस >30 सेकंड सम्मिलित करने के लिए, यहां तक कि का उपयोग कर भारी मात्रा सम्मिलित करें)
- के दौरान सम्मिलित पूरी तालिका को बंद कर दिया है, यानी केवल एक उपयोगकर्ता सम्मिलित कर सकते हैं एक समय में
- पुनर्प्राप्त डेटा भी काफी धीमी गति से अनुरोध 1e6 रिकॉर्ड कभी कभी लेता है >10 सेकंड
- हटाने श्रृंखला के साथ >1e6 रिकॉर्ड नियमित रूप से समय समाप्ति का कारण बनता है पर वेब अनुप्रयोग की ओर ।
डेटा कभी आंशिक रूप से चयनित है, तो हम वास्तव में जरूरत नहीं है करने के लिए यह एक टेबल में. लेकिन यह 'बाहर thinned' के प्रदर्शन से पहले करने के लिए भेजा ग्राहकों, यानी 1e6 रिकॉर्ड कर रहे हैं - डिफ़ॉल्ट रूप से, यानी के 99% में मामलों का उपयोग करें - करने के लिए कम 2000 या 10'000 के रिकॉर्ड से पहले ग्राहक के लिए भेजा. इस कैश की गई है, क्लाइंट पर है, लेकिन अगर एक नए ग्राहक के अनुरोध के एक ही सेट के साथ, यह फिर से संसाधित. मूल्यों की मेज भी एक सूचकांक पर series_id
लेता है, जो और अधिक डिस्क स्थान की तुलना में तालिका में ही है ।
मैं सोच रहा हूँ कि क्या यह समझ बनाने के लिए बदलने के लिए इस भंडारण प्रारूप करने के लिए एक बूँद भंडारण में "मूल्यों" के साथ अपने स्वयं के डेटा प्रारूप (सीएसवी या JSON या बाइनरी), और - शायद - अतिरिक्त कॉलम के साथ preprocessed 'कम' डेटासेट के लिए प्रदर्शन कर सकते हैं, जो धक्का दिया जा करने के लिए ग्राहकों के बिना परिवर्तन (उदाहरण के लिए । में JSON). इसलिए नए Values
तालिका स्वरूप के लिए किया जाएगा की तरह कुछ
id, series_id, data(blob), reduced_data(blob)
और वहाँ होना चाहते हैं सिर्फ एक Value
प्रति Series
प्रविष्टि, नहीं 1e6 या अधिक. कम डेटासेट बनाया जाएगा एक बार जब अपलोड किया गया डेटा प्राप्त हुआ है, और फिर के लिए इस्तेमाल किया प्रदर्शन जब यह ग्राहकों के अनुरोध
मैं खो देंगे आंशिक चयन के values
आईडी के आधार पर या एक्स/Y मान, लेकिन मूल्यों नहीं कर रहे हैं के आधार पर चयन के अलावा अन्य कुछ भी id
या series_id
तो, यह वर्तमान में एक सीमा नहीं. तो यहाँ मेरा सवाल है:
- इस अर्थ है सब पर? मुझे उम्मीद है निर्माण और विलोपन की एक बड़ी बूँद डेटासेट किया जा करने के लिए हमेशा की तुलना में काफी तेजी से निर्माण और विलोपन के 1,000,000 एकल रिकॉर्ड. यह सच है?
- बाइनरी बूँद या सीएसवी/JSON/.. बूँद? सबसे सरल दृष्टिकोण के लिए बूँद भंडारण के पाठ्यक्रम बनाने के लिए एक सीएसवी या JSON हिस्सा है और इसे बचाने के लिए (संभवतः gzipped) में डेटाबेस. एक कस्टम बाइनरी डेटा स्वरूप के लिए किया जाएगा यहां तक कि छोटे, लेकिन यह होता है करने के लिए परिवर्तित किया जा सकता JSON करने के लिए भेजा से पहले ग्राहकों के लिए.
मैं एक लग रहा है अतिरिक्त परेशानी के साथ आ रहा बाइनरी डेटा प्रारूपों के लायक नहीं हो सकता यह है और यह करने के लिए बेहतर gzip सीएसवी/JSON बूँद से आविष्कार करने के लिए एक बाइनरी स्वरूप है । यह सच है?
कैसे के बारे में अन्य कमियां के चुंबकत्व है कि मैं भी पता नहीं हो सकता है? आकार सीमाओं नहीं लग रहे करने के लिए एक मुद्दा हो, varbinary(MAX)
के लिए पर्याप्त है । मैं नहीं की जरूरत है एक सूचकांक मूल्यों पर अंदर बूँद, बस पर मेटाडाटा (जो श्रृंखला में तालिका).
विचार?