2017-06-02 15 views
16

चलाने के लिए बहुत अधिक समय लेता है मेरे पास एक नोड ऐप है जो एक्स, वाई डॉट प्लॉट ग्राफ़ पर डेटा प्लॉट करता है। वर्तमान में, मैं फ्रंट एंड से एक जीईटी अनुरोध करता हूं और मेरा बैक एंड नोड सर्वर अनुरोध स्वीकार करता है, डेटा बिंदुओं की एक सरणी के माध्यम से लूप करता है, 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 सेकंड

+0

क्या प्लंकर में 800,000 अंक हैं? इसे पूरा होने में लगभग 4 सेकंड लगते हैं, और 700 मिलीसेकंड नहीं होने पर कहा गया है। – Arg0n

+0

हां इसमें 800k है। जिस समय आप देखते हैं वह यह गणना करने के लिए होता है कि प्रत्येक बिंदु क्या रंग है। शेष समय कैनवास पर साजिश खर्च कर रहा है। मैं इसके बारे में चिंतित नहीं हूं क्योंकि उस हिस्से में नोड बहुत तेज है। लेकिन यह गणना करने में धीमी है कि एक बिंदु बहुभुज में है या नहीं, जब एल्गोरिदम HTTP अनुरोध के भीतर चलाया जाता है ... – Mark

+0

मेरे पास वास्तव में आपके लिए कोई जवाब नहीं है, लेकिन मैंने निष्पादन समय को लगभग आधा सुंदर में घटा दिया 'every' और' for'-छोरों के साथ 'forEach' की जगह: https://plnkr.co/edit/BfE35V9eTxfUpKIiC58N?p=preview – Arg0n

उत्तर

2

से एल्गोरिदम कम हो जाता है, बस आपके कोड का एक संस्करण nodeJS सेवा के रूप में चला रहा है। कोड आपके प्लंकर से लिया गया है। निष्पादन समय डेटा में 100,000 पंक्तियों के लिए 171 एमएसईसी था (पहली बार 10K पंक्तियों को दो बार दोहराया गया। यहां मैंने जो किया है:

सबसे पहले, आपके डेटा.जेसन और गेट्स.जेसन फ़ाइलें वास्तव में जेएसओएन फाइल नहीं हैं, वे जावास्क्रिप्ट फाइलें हैं I सामने से विभिन्न डेटा/गेट्स = कथन हटा दिए और समाप्ति अर्धविराम को हटा दिया। आप जिस मुद्दे का सामना कर रहे हैं, उसे आपके ऐप में अपने डेटा सेट में पढ़ने के तरीके के साथ करना होगा।चूंकि आप गेट्स या डेटा को संशोधित नहीं करते हैं, इसलिए मैंने उन्हें सर्वर पर सेट-अप के हिस्से के रूप में पढ़ा है, जो कि आप ब्राउज़र में प्रोसेसिंग कर रहे हैं। यदि आपको सर्वर तक पहुंचने पर हर बार फ़ाइलों को पढ़ने की आवश्यकता होती है, तो निश्चित रूप से, समय बदल जाएगा। उस परिवर्तन ने निष्पादन का समय 171 एमएसईसी से 515 एमएसईसी तक लिया - अभी भी जो कुछ भी आप देख रहे हैं उसके करीब कुछ नहीं। यह एक मैकबुक प्रो पर निष्पादित किया जा रहा है। यदि आवश्यक हो, तो मैं नेटवर्क एक्सेस क्लाउड सर्वर से समय अपडेट कर सकता हूं।

हो रही फ़ाइलें:

var fs = require("fs"); 
var path = require("path"); 
var data = []; 
var allGatesChain; 
var events = []; 
var x, y, pointX, pointY; 

var filename = __dirname + "/data.txt"; 

data = JSON.parse(fs.readFileSync(filename, "utf-8")); 
filename = __dirname + "/gates.json"; 
var gates = JSON.parse(fs.readFileSync(filename, "utf-8")); 

मैं अपनी दिनचर्या में ले जाया निर्यात समारोह में allGatesChain और घटनाओं बनाने के लिए:

allGatesChain = getAllGatesChain(); 
    generateData(); 
    console.log("events is "+events.length+" elements long. events[0] is: "+events[0]); 
    console.log("data is "+data.length+" elements long. data[0] is "+data[0]); 

और फिर अपना कोड भाग गया:

var start, end; 
    var plotColor = []; 
    start = new Date().getTime(); 
    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({ 
     gateChain: allGatesChain, 
     events: events, 
     i: i 
    }); 
    color = color; 
    plotColor.push({ 
     color: color, 
     pointX: pointX, 
     pointY : pointY 
    }); 
    } 
    end = new Date().getTime(); 
    var _str = "loop execution took: "+(end-start)+" milliseconds."; 
    console.log(_str); 
    res.send(_str); 

परिणाम 171 एमएसईसी था।

+0

स्वामी द्वारा बक्षीस प्राप्त कर सकें, इस सब के बाद बीमार जाओ और सवाल अपडेट करें! – Mark

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