चलाने के लिए बहुत अधिक समय लेता है मेरे पास एक नोड ऐप है जो एक्स, वाई डॉट प्लॉट ग्राफ़ पर डेटा प्लॉट करता है। वर्तमान में, मैं फ्रंट एंड से एक जीईटी अनुरोध करता हूं और मेरा बैक एंड नोड सर्वर अनुरोध स्वीकार करता है, डेटा बिंदुओं की एक सरणी के माध्यम से लूप करता है, Node Canvas का उपयोग करके कैनवास खींचता है और इसे पीएनजी छवि के रूप में प्रदर्शित किया जाता है जहां इसे फ्रंट एंड पर वापस स्ट्रीम करता है।नोड HTTP अनुरोध के भीतर से चलाए गए एल्गोरिदम
जटिल चीजें यह है कि बहुभुज हो सकते हैं इसलिए point in polygon पैकेज का उपयोग करते हुए एक बिंदु बहुभुज के अंदर एक बिंदु है, और रंग जो आंकड़े अलग-अलग होते हैं, तो रंग अलग-अलग होते हैं।
50,000 से कम डेटा पॉइंट होने पर यह ठीक काम करता है। हालांकि, जब 800,000 अनुरोध होते हैं तो अनुरोध लगभग 23 सेकंड लेता है। मैंने कोड का प्रोफाइल किया है और उस समय का अधिकांश समय सभी डेटा बिंदुओं के माध्यम से लूपिंग किया जाता है और यह पता लगाया जाता है कि इसे कैनवास पर प्लॉट करना है और किस रंग (यदि यह एक या अधिक बहुभुज में है) के आधार पर। मैंने बनाया है plunker यहाँ है। असल में मैं ऐसा कुछ करता हूं:
for (var i = 0; i < data.length; i++) {
// get raw points
x = data[i][0];
y = data[i][1];
// convert to a point on canvas
pointX = getPointOnCanvas(x);
pointY = getPointOnCanvas(y, 'y');
color = getColorOfCell(pointX, pointY);
color = color;
plotColor.push({
color: color,
pointX: pointX,
pointY : pointY
});
}
// draw the dots down here
एल्गोरिदम स्वयं समस्या नहीं है। मेरे पास यह मुद्दा यह है कि जब एल्गोरिदम HTTP अनुरोध के भीतर चलाया जाता है, तो यह गणना करने में काफी समय लगता है कि एक बिंदु क्या है - लगभग 16 सेकंड। लेकिन यदि इसे सामने के अंत में क्रोम में किया जाता है, तो यह केवल एक सेकंड से अधिक होता है (प्लंकर देखें)। जब मैं नोड के साथ कमांड लाइन पर एल्गोरिदम चलाता हूं, तो इसमें एक सेकंड से भी कम समय लगता है। तो तथ्य यह है कि मेरा ऐप HTTP अनुरोध के भीतर एल्गोरिदम चलाता है, इसे बड़े पैमाने पर धीमा कर रहा है। तो कुछ प्रश्न:
यह क्यों होगा? एक HTTP अनुरोध के भीतर से एक एल्गोरिदम क्यों चल रहा है इतना लंबा लेता है?
यदि कुछ भी हो, तो इसे ठीक करने के लिए मैं क्या कर सकता हूं? क्या यह किसी भी तरह से कार्य शुरू करने का अनुरोध करना संभव होगा, और फिर पूर्ण होने पर पीएनजी को पुनः प्राप्त करें और पुनः प्राप्त करें?
EDIT मैंने पूरी तरह से एल्गोरिदम चलाने और कमांड लाइन के माध्यम से एक पीएनजी बनाने का परीक्षण किया। 800k डेटा पॉइंट्स में से प्रत्येक रंग का रंग क्या होना चाहिए, यह काम करने के लिए आधे सेकेंड से भी कम है। मैं सर्वर से अनुरोध करने और कार्य शुरू करने के लिए सॉकेट का उपयोग करने के बारे में सोच रहा हूं, फिर इसे छवि वापस कर दें। मैं हालांकि क्यों कोड इतने लंबे समय ले जाना चाहिए जब एक HTTP अनुरोध में चलने को विस्मित कर रहा हूँ ...
संपादित समस्या मोंगो और नेवला है। मैं मोंगो में प्रत्येक बहुभुज के निर्देशांक स्टोर करता हूं। मैं इन निर्देशांकों को एक बार लाता हूं लेकिन जब मैं उन्हें प्रत्येक एक्स, वाई बिंदु/से तुलना करता हूं। किसी भी तरह, यह एल्गोरिदम में बड़े पैमाने पर देरी कर रहा है। जब एक नेवला वस्तु का उपयोग कर वहाँ बहुत सारे हैं - अगर मैं मोंगो दस्तावेज़ को बंद, एल्गोरिथ्म 1.5 सेकंड ......
संपादित @DevDig टिप्पणी अनुभाग में मुख्य समस्या बताया करने के लिए 16 सेकंड से चला जाता है गेटर्स और सेटर्स की धीमी गति से। क्वेरी में दुबला() का उपयोग करके 16 सेकंड से 1.5 सेकंड
क्या प्लंकर में 800,000 अंक हैं? इसे पूरा होने में लगभग 4 सेकंड लगते हैं, और 700 मिलीसेकंड नहीं होने पर कहा गया है। – Arg0n
हां इसमें 800k है। जिस समय आप देखते हैं वह यह गणना करने के लिए होता है कि प्रत्येक बिंदु क्या रंग है। शेष समय कैनवास पर साजिश खर्च कर रहा है। मैं इसके बारे में चिंतित नहीं हूं क्योंकि उस हिस्से में नोड बहुत तेज है। लेकिन यह गणना करने में धीमी है कि एक बिंदु बहुभुज में है या नहीं, जब एल्गोरिदम HTTP अनुरोध के भीतर चलाया जाता है ... – Mark
मेरे पास वास्तव में आपके लिए कोई जवाब नहीं है, लेकिन मैंने निष्पादन समय को लगभग आधा सुंदर में घटा दिया 'every' और' for'-छोरों के साथ 'forEach' की जगह: https://plnkr.co/edit/BfE35V9eTxfUpKIiC58N?p=preview – Arg0n