2013-03-08 31 views
12

मैं अपने डिवाइस पर कुछ प्रदर्शन मुद्दों को देखकर काफी समय बिता रहा हूं, और ध्यान दिया है कि हमारे पास डीबी पढ़ने/लिखने वाले कुछ ऐप्स हैं ..InsertHelper क्यों बहिष्कृत किया गया था?

मैंने नए संपर्कों को सम्मिलित करने के लिए संपर्क API का उपयोग करके शुरुआत की & डेटा पंक्तियां, और यह दर्दनाक रूप से धीमी थी। 1 मिनट 18 सेकंड लगभग 1500 पंक्तियों (250 कच्चे संपर्क & 1250 डेटा पंक्तियों) ..

मैं प्रदर्शन आवेषण के लिए किसी अन्य ऐप्स में डालने सहायक का इस्तेमाल किया था सम्मिलित करने के लिए, और एक परीक्षण ऐप जो अलग db के लिए लिखने का फ़ैसला किया डब्ल्यू/अलग डालने के तरीके।

प्रत्येक डीबी में एक टेबल है, प्रत्येक डब्ल्यू/4 कॉलम: _ID, नाम, समय, और ब्लॉब (सभी प्रकार 'स्ट्रिंग') - जैसे संपर्क प्रदाता डेटा कॉलम को परिभाषित करता है।

_ID ऑटो वृद्धि पीके है, नाम सिर्फ उसी चीज को '1234567890' डालता है, समय केवल मिलिज़ में वर्तमान सिस्टम समय है, और ब्लॉब एक ​​स्ट्रिंग डब्ल्यू/लंबाई 6400 अक्षर 'ए' से भरा है ...

मैं पहली बार थोक डालने की जाँच की है, लेकिन सभी यह करता है सब आवेषण आपके द्वारा परिभाषित के माध्यम से छोरों है, और बस के रूप में अलग-अलग आवेषण कर (या नगण्य प्रदर्शन प्रभाव) के रूप में धीमी है ..

मैं 3 अलग परीक्षण किया आवेषण करने के तरीके: ContentValues ​​w/db.insert विधि: SQLiteStatement w/statement.execute() (लेनदेन के अंदर किया गया)। स्क्लाइट इंसर्ट हेल्पर डब्ल्यू/लेनदेन।

मैं कुछ कोड प्रदान कर सकते हैं, लेकिन मैं InsertHelper से उत्कृष्ट प्रदर्शन है, और सोच क्यों यह पदावनत किया गया था: 7.778 सेकंड (82 बाइट्स लिखा/एमएस) :

100 रिकॉर्ड ContentValues ​​सम्मिलित करने के लिए समय SQLiteStatement: 1.311 सेकंड (48 9 बाइट्स लिखित/एमएस) स्क्लाइटइन्सर्टहेलपर: 0.2 9 2 सेकेंड (21 9 7 बाइट्स लिखित/एमएस)

कोई विचार?

+0

मैं कुछ अतिरिक्त परीक्षण किया था, और एक नियमित रूप से डालने के लिए किया था, लेकिन यह एक लेन-देन का हिस्सा है, यह प्रदर्शन काफी सुधार किए गए। ऐसा लगता है कि कुछ कोड संभवतः उपज करने के लिए आवश्यक है (संपर्क प्रदाता को देख रहे हैं)। – Chrispix

+0

आपके द्वारा उल्लिखित प्रदर्शन समस्या को देखते हुए, लेन-देन मेरा पहला सुझाव होगा (प्रत्येक लेन-देन के लिए राउंड-ट्रिप की आवश्यकता होती है IO प्रतीक्षा करता है, लेनदेन के बाहर प्रत्येक डालने को निश्चित रूप से एक में लपेटा जाता है)। अतीत में, यह उपयोगी पठन हो सकता है: http://stackoverflow.com/questions/14344172/android-bulk-insert-when-inserthelper-is-deprecated – rutter

+0

मैंने लेन-देन का भी सुझाव दिया होगा। लेनदेन के साथ मैंने जिन आवेषणों का परीक्षण किया है, वे काफी तेज हैं। Http://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html के अनुसार – Luis

उत्तर

0

InsertHelper उपयोगकर्ताओं को एक ही कथन का उपयोग करके तालिका में एकाधिक प्रविष्टियां करने की अनुमति देता है। लेकिन यह not thread-safe जैसे डालने का एक अच्छा तरीका नहीं है।

+3

, वैकल्पिक अनुशंसा धागा सुरक्षित नहीं है –

0

आपको transactions. का उपयोग करना चाहिए। यदि आप डेटाबेस ऑपरेशन के लिए स्पष्ट रूप से लेनदेन नहीं बनाते हैं तो ढांचा प्रत्येक के लिए एक बनाता है। अपने ऑब्जेक्ट को एक साथ समूहित करें और उन्हें एक साथ में डालें। यह प्रदर्शन में काफी वृद्धि करेगा।

4

किसी भी जानकारी से आना मुश्किल है कि क्यों इंसर्टहेल्पर को वास्तविक प्रतिबद्धता के बिना बहिष्कृत किया गया था जो इसे कम करता है। इंजेरहेल्पर को बहिष्कृत करने वाले अभियंता ने निम्नलिखित कारण दिए:

यह कक्षा SQLiteStatement पर कोई लाभ प्रदान नहीं करती है और केवल कोड को अधिक जटिल और त्रुटि-प्रवण बनाता है।

InsertHelper से SQLiteStatement से रिफैक्टरिंग के बाद मैं सहमत हूं। एक अपवाद शून्य-सुरक्षित बाध्यकारी कार्यों के लिए हैं। जबकि InsertHelper स्वचालित रूप से आपके लिए bindNull() को कॉल करता है, SQLiteStatement क्रैश होता है यदि आप पास करते हैं, उदाहरण के लिए, एक नल स्ट्रिंग और आपको bindString() को कॉल करने से पहले अपनी खुद की शून्य जांच करनी होगी।

देखें: https://android.googlesource.com/platform/frameworks/base/+/b33eb4e%5E!/

+0

आधिकारिक उत्तर प्राप्त करने के लिए प्रतिबद्ध लॉग पर जाने के लिए उपरोक्त। अगर मैं कर सकता तो आपको और अधिक दे दूंगा। – Dalbergia

संबंधित मुद्दे