javascript - फायरस्टार डेटा प्राप्त करने के लिए धीमी गति से प्रदर्शन का मुद्दा




performance firebase (3)

मैं 1/10 अनुपात के साथ रीयलटाइम डेटाबेस की तुलना में एक दस्तावेज़ में संग्रहीत मूल डेटा को पुनर्प्राप्त करते हुए फायरस्टार के साथ धीमी गति से प्रदर्शन के मुद्दे पर हूं।

फायरस्टार का उपयोग करते हुए, यह पहली कॉल पर औसतन 3000 एमएस लेता है

 this.db.collection(‘testCol’)
   .doc(‘testDoc’)
   .valueChanges().forEach((data) => {
     console.log(data);//3000 ms later
 });

रीयलटाइम डेटाबेस का उपयोग करते हुए, यह पहली कॉल पर औसतन 300 एमएस लेता है

 this.db.database.ref(‘/test’).once(‘value’).then(data => {
     console.log(data); //300ms later
 });

यह नेटवर्क कंसोल का एक स्क्रीनशॉट है:

मैं AngularFire2 v5.0 rc.2 के साथ जावास्क्रिप्ट SDK v4.50 चला रहा हूं।

क्या किसी ने इस मुद्दे का अनुभव किया?


अच्छी तरह से, मैं वर्तमान में एमुलेटर और वास्तविक एंड्रॉइड फोन हुआवेई पी 8 में नेक्सस 5 एक्स का उपयोग करके क्या कर रहा हूं और अनुसंधान कर रहा हूं,

फायरस्टार और क्लाउड स्टोरेज दोनों ही मुझे धीमी प्रतिक्रिया का सिरदर्द देते हैं, जब मैं पहला डॉक्यूमेंट करता हूं। () और पहला स्टोरेज ।getDownloadUrl ()

यह मुझे प्रत्येक अनुरोध पर 60 सेकंड से अधिक प्रतिक्रिया देता है। धीमी प्रतिक्रिया केवल वास्तविक एंड्रॉइड फोन में होती है। एमुलेटर में नहीं। एक और अजीब बात। पहली मुठभेड़ के बाद, बाकी अनुरोध सुचारू है।

यहां सरल कोड है जहां मुझे धीमी प्रतिक्रिया मिलती है।

var dbuserref = dbFireStore.collection('user').where('email','==',email);
const querySnapshot = await dbuserref.get();

var url = await defaultStorage.ref(document.data().image_path).getDownloadURL();

मुझे लिंक भी मिला जो उसी पर शोध कर रहा है। https://reformatcode.com/code/android/firestore-document-get-performance


आज सुबह तक मेरे पास यह मुद्दा था। IOS / स्विफ्ट के माध्यम से मेरी फायरस्टार क्वेरी को एक साधारण, पूरी तरह से अनुक्रमित क्वेरी को पूरा करने में लगभग 20 सेकंड लगेंगे - 1 आइटम के लिए गैर-आनुपातिक क्वेरी समय के साथ - सभी तरह से 3,000 तक।

मेरा समाधान ऑफ़लाइन डेटा दृढ़ता को अक्षम करना था। मेरे मामले में, यह हमारे फायरस्टार डेटाबेस की आवश्यकताओं के अनुरूप नहीं था - जिसके डेटा के बड़े हिस्से हर दिन अपडेट होते हैं।

आईओएस और एंड्रॉइड उपयोगकर्ताओं के पास यह विकल्प डिफ़ॉल्ट रूप से सक्षम है, जबकि वेब उपयोगकर्ताओं ने इसे डिफ़ॉल्ट रूप से अक्षम कर दिया है। यदि आप दस्तावेज़ों के विशाल संग्रह को क्वेरी कर रहे हैं, तो यह फायरस्टार को बहुत धीमा लगता है। मूल रूप से यह आपके द्वारा क्वेरी किए जा रहे डेटा (और जो भी संग्रह आप क्वेरी कर रहे हैं - की एक प्रति कैश करता है - मेरा मानना ​​है कि यह सभी दस्तावेज़ों को कैश करता है) जिससे उच्च मेमोरी उपयोग हो सकता है।

मेरे मामले में, इसने प्रत्येक क्वेरी के लिए एक बड़ा इंतजार किया, जब तक कि डिवाइस ने आवश्यक डेटा को कैश नहीं कर लिया - इसलिए वस्तुओं की बढ़ती संख्या के लिए गैर-आनुपातिक क्वेरी बार सटीक समान संग्रह से वापस जाने के लिए। ऐसा इसलिए है क्योंकि प्रत्येक क्वेरी में संग्रह को कैश करने में समान समय लगा।

ऑफलाइन डेटा - क्लाउड फायरस्टार डॉक्स से

मैंने इस क्वेरी को एक ही क्लेरिड कलेक्शन से (ऑफलाइन दृढ़ता के साथ सक्षम) प्रदर्शित करने के लिए कुछ बेंचमार्किंग का प्रदर्शन किया, लेकिन विभिन्न मात्राओं के साथ .limit पैरामीटर का उपयोग करके वापस लौटा:

अब 100 वस्तुओं पर (ऑफ़लाइन दृढ़ता के साथ अक्षम) लौटा, मेरी क्वेरी को पूरा होने में 1 सेकंड से भी कम समय लगता है।

मेरा फायरस्टार क्वेरी कोड नीचे है:

let db = Firestore.firestore()
self.date = Date()
let ref = db.collection("collection").whereField("Int", isEqualTo: SomeInt).order(by: "AnotherInt", descending: true).limit(to: 100)
ref.getDocuments() { (querySnapshot, err) in
    if let err = err {
        print("Error getting documents: \(err)")
    } else {
        for document in querySnapshot!.documents {
            let data = document.data()
            //Do things
        }
        print("QUERY DONE")
        let currentTime = Date()
        let components = Calendar.current.dateComponents([.second], from: self.date, to: currentTime)
        let seconds = components.second!
        print("Elapsed time for Firestore query -> \(seconds)s")
        // Benchmark result
    }
}

अपडेट की तारीख 02 मार्च, 2018

ऐसा लगता है कि यह एक ज्ञात मुद्दा है और फायरस्टार के इंजीनियर एक फिक्स पर काम कर रहे हैं। इस मुद्दे पर एक फायरस्टार इंजीनियर के साथ कुछ ईमेल एक्सचेंज और कोड शेयरिंग के बाद, यह आज की तरह उनकी प्रतिक्रिया थी।

"आप वास्तव में सही हैं। आगे की जाँच करने पर, getDocuments () API पर यह सुस्ती क्लाउडस्टोरेस्ट बीटा में एक ज्ञात व्यवहार है। हमारे इंजीनियरों को" ठंड शुरू "के रूप में टैग किए गए इस प्रदर्शन मुद्दे के बारे में पता है, लेकिन चिंता मत करो जैसे हम कर रहे हैं। फायरस्टार क्वेरी के प्रदर्शन को बेहतर बनाने के लिए हमारा सर्वश्रेष्ठ।

हम पहले से ही एक दीर्घकालिक फिक्स पर काम कर रहे हैं, लेकिन मैं फिलहाल कोई समयसीमा या बारीकियों को साझा नहीं कर सकता। जबकि फायरस्टार अभी भी बीटा पर है, उम्मीद करें कि आने के लिए और सुधार होंगे। "

इसलिए उम्मीद है कि यह जल्द ही दस्तक देगा।

स्विफ्ट / आईओएस का उपयोग करना

लगभग 3 दिनों तक इससे निपटने के बाद ऐसा लगता है कि यह मुद्दा निश्चित रूप से () .getDocuments और .getDocument है। मैंने सोचा कि चीजें चरम पर रुक-रुक कर देरी कर रही थीं, लेकिन ऐसा प्रतीत नहीं होता:

  1. इतना बढ़िया नेटवर्क कनेक्टिविटी नहीं
  2. .GetDocument () के माध्यम से बार-बार कॉल करना
  3. जंजीर मिल () कॉल
  4. फायरस्टार कोल्ड स्टार्ट
  5. कई दस्तावेज़ प्राप्त करना (1 छोटा दस्तावेज़ 20 सेकंड की देरी का कारण बना)
  6. कैशिंग (मैंने ऑफ़लाइन दृढ़ता को अक्षम किया लेकिन यह कुछ भी नहीं किया।)

मैं इन सभी को नियंत्रित करने में सक्षम था जैसा कि मैंने देखा कि यह मुद्दा हर फायरस्टार डेटाबेस कॉल के साथ नहीं था जो मैं बना रहा था। केवल प्राप्त करने का उपयोग कर पुनर्प्राप्ति ()। Kicks के लिए मैंने .getDocument को .addSnapshotListener से बदल दिया और अपना डेटा और वॉइला प्राप्त करने के लिए। पहली कॉल सहित हर बार तत्काल पुनर्प्राप्ति। कोई ठंड शुरू नहीं होती। अब तक .addSnapshotListener के साथ कोई समस्या नहीं है, केवल getDocument (s)।

अभी के लिए, मैं केवल .getDocument () को छोड़ रहा हूं, जहां समय सार का है और इसे .addSnapshotListener के साथ प्रतिस्थापित कर रहा है

for document in querySnapshot!.documents{
// do some magical unicorn stuff here with my document.data()
}

... तब तक चलते रहने के लिए जब तक फायरस्टार द्वारा काम नहीं किया जाता।








angularfire2