बहुत सारे परीक्षण के बाद मैंने अंततः पाया कि समस्या एंटिटी फ्रेमवर्क या एनपीजीएसक्ल में बिल्कुल भी नहीं थी, लेकिन मैं जो देरी देख रहा था वह कैशिंग लिखने के कारण था। मैं तालिका 1 में एक पंक्ति डालने से पहले हमेशा 30MB फ़ाइल लिख रहा था और मेरा मानना था कि फ़ाइल लेखन File.WriteAllBytes के वापस आने के बाद किया गया था, इसलिए यह भविष्य के किसी भी समय के विवरण को प्रभावित नहीं करेगा। हालाँकि OS परत पर यह वास्तव में डिस्क पर लिखने के लिए नहीं किया गया था जब तक कि सम्मिलित विवरण चलाया गया था, जिससे सम्मिलित विवरण कृत्रिम रूप से विलंबित हो गया था।
मैंने इसे निम्नलिखित कोड से साबित किया:
Stopwatch sw1 = new Stopwatch();
sw1.Start();
File.WriteAllBytes(myBytes);
sw1.Stop();
Thread.Sleep(1000);
Stopwatch sw2 = new Stopwatch();
sw2.Start();
MethodThatInsertsIntoTable1();
sw2.Stop();
स्टॉपवॉच 1 ने दिखाया कि File.WriteAllBytes में हमेशा लगभग 500ms लगते हैं, फिर स्टॉपवॉच 2 का समय लगभग 20 से 30 सेकंड तक होता है।
यदि मैं किसी भिन्न तालिका में सम्मिलित करने के लिए MethodThatInsertsIntoTable1 को बदलता हूं तो तालिका की परवाह किए बिना इसमें अभी भी 20 से 30 सेकंड लगते हैं।
अगर मैं Thread.Sleep(1000) से Thread.Sleep(30000) बढ़ा देता हूं तो स्टॉपवॉच 2 रिकॉर्ड करता है कि इंसर्ट में 10 मिलीसेकंड से कम समय लगता है।
इससे पता चलता है कि File.WriteAllBytes प्रोग्राम पर नियंत्रण वापस करने के बाद भी, यह वास्तव में डिस्क पर फ़ाइल लिखने के लिए वास्तव में पूरा नहीं हुआ है।
मैं जिस वातावरण पर चल रहा था वह रास्पबेरी पाई पर लिनक्स था। एक लिखने की गति परीक्षण पुष्टि करता है कि एसडी कार्ड में मेरी लिखने की गति 1 एमबी/एस से अधिक है जो मेरे द्वारा देखे जा रहे परिणामों के साथ संरेखित होगी, 30 एमबी फ़ाइल लिखने के लिए 20-30 सेकंड, यह संभवतः 500 एमएमएस में नहीं किया जा सका वह स्टॉपवॉच 1 कहती है कि वह थी।
ऐसा लगता है कि किसी अन्य उपयोगकर्ता को इसके कारण File.WriteAllBytes में समस्या का सामना करना पड़ रहा है। ब्लॉक न करें
रास्पबेरी पाई में एक बाहरी एसएसडी यूएसबी एचडीडी जोड़ने और इसके बजाय फ़ाइल को सहेजने के लिए बदलने के बाद, फ़ाइल को सहेजने में केवल 0.5 सेकंड लगते हैं और समस्या दूर हो जाती है।