2015-11-22 5 views
5

का उपयोग कर एक सी ++ प्रोग्राम के अंदर रैम खपत मैं एक सी ++ प्रोग्राम के अंदर sqlite3 dbms का उपयोग कर रहा हूं जिसका उपयोग मुख्य रूप से ब्लॉब ऑब्जेक्ट्स के रूप में फ़ाइलों को संग्रहीत करने के लिए करता है (मुझे पता है कि यह सबसे अच्छा विकल्प नहीं है)।एसक्लाइट 3 ब्लोब

जाहिर है मैं उन्हें संवर्द्धित लिखने के बाद से वे आदेश मैं बंधन समारोह sqlite3_bind_zeroblob(...) का उपयोग कर पहली ब्लॉब की एक प्लेसहोल्डर बनाने के लिए और उसके बाद मैं ब्लॉब लेखन और पढ़ने को खोलने के ऐसा करने के लिए कभी कभी बड़े (40-80MB) हो सकता है बढ़ती से और इसके लिए।

समस्या का सामना करना पड़ रहा हूँ कि जब मैं ब्लॉब प्लेसहोल्डर बनाने (sqlite3_step के दौरान) मेरे ऐप की रैम की खपत 2-3 सेकंड के लिए 80-160MB तक पहुँच जाता है, एक बार यह रैम की खपत बना दिया गया है 2 को वापस चला जाता है सबसे अधिक -3 एमबी।

मुझे क्यों नहीं मिलता है! अगर उन्होंने ब्लॉब को लिखने के लिए एक तरीका बनाया है तो निश्चित रूप से 160 एमबी रैम बर्बाद किए बिना उस बेवकूफ प्लेसहोल्डर को बनाने का एक तरीका है, लेकिन मुझे यह नहीं मिला। क्या आपको कोई सुझाव मिला है?

sqlite3_stmt* stm = NULL; 
sqlite3_blob *BLOB = NULL; 

rc = sqlite3_prepare_v2(db, sql.c_str(), -1, &stm, NULL); 

rc = sqlite3_bind_blob(stm, 1, wpath.c_str(), wpath.size()*sizeof(wchar_t), SQLITE_STATIC); 
rc = sqlite3_bind_text(stm, 2, hash.c_str(), hash.size(), SQLITE_STATIC); 
rc = sqlite3_bind_zeroblob(stm, 3, size); 
rc = sqlite3_bind_int(stm, 4, versione); 
rc = sqlite3_bind_blob(stm, 5, last.c_str(), last.size()*sizeof(wchar_t), SQLITE_STATIC); 

rc = sqlite3_step(stm); 

if (rc != SQLITE_DONE) { 
    fprintf(stderr, " This file was already present in the database!\n", rc); 
    return; 
} 
else { 
    fprintf(stdout, "Record FILE created successfully\n"); 
} 
+0

हो सकता है यह शून्य लिखने के लिए कैश उपयोग है, कम से कम करने के लिए कैश आकार सेट करने का प्रयास? – fghj

+0

एसक्यूएल क्वेरी क्या है? –

+0

मैंने कैश मान संशोधित किया लेकिन कुछ भी बदलना प्रतीत नहीं होता है। वैसे भी एसक्यूएल क्वेरी निम्नलिखित std :: string sql = "फाइलों में प्रवेश करें (पथ, हैश, डेटा, वीर, आखिरी) मूल्य (? 1, 2, 3, 4, 4, 5);"; – GalloCedrone

उत्तर

2

यह एक समस्या है HERE
और Oficial जवाब है:

आदेश zeroblobs (भले ही कितना बड़ा वे कर रहे हैं स्मृति की एक निश्चित राशि का उपयोग) के रूप में ऊपर काम करने के लिए सभी zeroblobs पंक्ति के अंत पर होना चाहिए। दूसरे शब्दों में, तालिका के कॉलम zeroblobs प्राप्त करने वाले तालिका में अंतिम कॉलम होना चाहिए। यदि कोई भी गैर-शून्य सामग्री zeroblob का पालन करती है, तो zeroblob शून्य बाइट्स के शाब्दिक अनुक्रम में विस्तारित है, जिसका अर्थ है कि स्मृति को पूरे ज़ीरोब्लोब के लिए आवंटित किया जाना चाहिए।

तो तुम इसे ठीक करने के आदेश को बदलने की जरूरत:

sqlite3_stmt* stm = NULL; 
sqlite3_blob *BLOB = NULL; 

rc = sqlite3_prepare_v2(db, sql.c_str(), -1, &stm, NULL); 

rc = sqlite3_bind_blob(stm, 1, wpath.c_str(), wpath.size()*sizeof(wchar_t), SQLITE_STATIC); 
rc = sqlite3_bind_text(stm, 2, hash.c_str(), hash.size(), SQLITE_STATIC); 
rc = sqlite3_bind_int(stm, 3, versione); 
rc = sqlite3_bind_blob(stm, 4, last.c_str(), last.size()*sizeof(wchar_t), SQLITE_STATIC); 
rc = sqlite3_bind_zeroblob(stm, 5, size); 

rc = sqlite3_step(stm); 

if (rc != SQLITE_DONE) { 
    fprintf(stderr, " This file was already present in the database!\n", rc); 
    return; 
} 
else { 
    fprintf(stdout, "Record FILE created successfully\n"); 
} 
+0

बहुत बहुत धन्यवाद, मुझे पता था कि उस व्यवहार और संभावित कामकाज के लिए स्पष्टीकरण था! – GalloCedrone

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