जावास्क्रिप्ट में एक सरणी का अधिकतम आकार


108

संदर्भ: मैं एक छोटी साइट का निर्माण कर रहा हूं जो एक आरएसएस फ़ीड को पढ़ती है, और पृष्ठभूमि में फ़ीड को अपडेट / चेक करती है। मेरे पास प्रदर्शन करने के लिए डेटा संग्रहीत करने के लिए एक सरणी है, और दूसरा जो आईडी के रिकॉर्ड को संग्रहीत करता है जो दिखाया गया है।

प्रश्न: चीज़ों के धीमे होने या सुस्त होने से पहले जावास्क्रिप्ट में कितने आइटम हो सकते हैं। मैं सरणी नहीं छांट रहा हूं, लेकिन तुलना करने के लिए jQuery के inArray फ़ंक्शन का उपयोग कर रहा हूं।

वेबसाइट को चालू छोड़ दिया जाएगा, और अपडेट करना और इसकी संभावना नहीं है कि ब्राउज़र को फिर से चालू / ताज़ा किया जाएगा।

अगर मुझे एरे से कुछ रिकॉर्ड्स क्लियर करने के बारे में सोचना चाहिए, तो एक सीमा के बाद कुछ रिकॉर्ड्स निकालने का सबसे अच्छा तरीका क्या है, जैसे 100 आइटम।


3
आप शायद जेएस कोड से टूलबार से मेमोरी लीक करने वाले ब्राउज़र के साथ अधिक समस्याओं में चलेंगे। :) फ़ायरफ़ॉक्स 4 मैं आप पर अपनी उंगली इंगित करता हूं।
उपसंहार

1
आप कितनी बार सरणी (पूर्व 2s अंतराल) की जाँच कर रहे हैं? सुस्त (पूर्व> 500ms) का गठन क्या है? आपके आवर्धन का क्रम क्या है (उदाहरण हजारों, लाखों, अरबों)?
zzzzBov

2
साथ बेंचमार्क परीक्षण करना jsperf.com
VirtualTroll

मैं हर मिनट सरणी की जाँच और अद्यतन करता रहूँगा। और हाँ सुस्त एक प्रदर्शन हिट होगा जो उस लोड और जांच को प्रभावित करना शुरू करता है, और पृष्ठ पर अन्य एनिमेशन, खेद को परिभाषित करना मुश्किल है!
addedlovely

@ लिंक के लिए धन्यवाद, ऐसा लगता है कि वेबसाइट मेरी नई सबसे अच्छी दोस्त होगी :)
जोड़ा

जवाबों:


153

जब तक "यह सुस्त हो जाता है" तक की अधिकतम लंबाई पूरी तरह से आपके लक्ष्य मशीन और आपके वास्तविक कोड पर निर्भर करती है, इसलिए आपको उस (उन) प्लेटफ़ॉर्म पर परीक्षण करने की आवश्यकता होगी जो स्वीकार्य है।

हालांकि, ECMA-262 5 वें संस्करण विनिर्देश के अनुसार एक सरणी की अधिकतम लंबाई ToUint32 सार ऑपरेशन के कारण अहस्ताक्षरित 32-बिट पूर्णांक से बंधी है , इसलिए सबसे लंबा संभव सरणी 2 32 -1 = 4,294,67,295 = 4.29 बिलियन तत्व हो सकता है ।


13
@ Barkermn01: ECMA-262 5th संस्करण विनिर्देश किसी भी ऑपरेशन पर किसी सरणी की लंबाई की जाँच करने के लिए अमूर्त ऑपरेशन ToUint32 का उपयोग करता है, जो इसकी लंबाई को संशोधित करता है, इसलिए मुझे लगता है कि मशीन (या वेब ब्राउज़र) की अंतर्निहित वास्तुकला अप्रासंगिक है।
मेयरिक्स

1
hrm नाइस ने पढ़ा कि एक awsome 64Bit ब्राउज़र तब व्यर्थ
बह रहा है

3
@ Barkermn01, 64 बिट ब्राउज़र अभी भी कई अन्य सुधारों को आगे बढ़ाते हैं। याद रखें कि एक जावास्क्रिप्ट इंटरप्रेटर होना केवल एक ब्राउज़र द्वारा की जाने वाली चीज़ नहीं है।
रेजर स्टॉर्म

1
Wowzer यह उच्च होने की उम्मीद नहीं है। ओके अच्छा मुझे लगता है कि मैं ठीक हो जाऊंगा!
अतिरिक्त रूप से

वास्तव में एक सरणी में अधिकतम 4294967295 (2 ^ 31-1) तत्व हो सकते हैं। देखें stackoverflow.com/a/12766547/396458
NullUserException

26

सरणी को ट्रिम करने की कोई आवश्यकता नहीं है, बस इसे एक परिपत्र बफर (इंडेक्स% अधिकतम) के रूप में संबोधित करें। यह सुनिश्चित करेगा कि यह कभी भी सीमा से अधिक न हो (एक परिपत्र बफ़र को लागू करने का अर्थ है कि एक बार जब आप अंत तक पहुंच जाते हैं तो आप फिर से शुरुआत के चारों ओर लपेटते हैं - सरणी के अंत से आगे बढ़ना संभव नहीं है)।

उदाहरण के लिए:

var container = new Array ();
var maxlen = 100;
var index = 0;

// 'store' 1538 items (only the last 'maxlen' items are kept)
for (var i=0; i<1538; i++) {
   container [index++ % maxlen] = "storing" + i;
}

// get element at index 11 (you want the 11th item in the array)
eleventh = container [(index + 11) % maxlen];

// get element at index 11 (you want the 11th item in the array)
thirtyfifth = container [(index + 35) % maxlen];

// print out all 100 elements that we have left in the array, note
// that it doesn't matter if we address past 100 - circular buffer
// so we'll simply get back to the beginning if we do that.
for (i=0; i<200; i++) {
   document.write (container[(index + i) % maxlen] + "<br>\n");
}

4
चतुर विचार, लेकिन ऐसा करने से आप संभावित डेटा को अधिलेखित कर देंगे, अनुक्रमित भ्रामक और संभवतः अजीब व्यवहार के परिणामस्वरूप।
जॉन ktejik

9
यह विचार एक रिंग-बफर को लागू करने के लिए है, इसलिए हां - आप जानबूझकर पुराने डेटा को "भूल रहे हैं" (जो कि रिंग बफर के लिए उपयोग किया जाता है) और यही सवाल प्रश्नकर्ता से पूछा गया था।
लेलंथ्रान

1
मैं एसओ के आसपास बस ऊब-क्लिक कर रहा था और यह प्रतिक्रिया मिली। जरूरत के रूप में ओवरराइटिंग इंडेक्स वाली तकनीक से प्यार करें।
केली हॉचकिस

5

आप परीक्षण और लंबाई ट्रिम करने के लिए कुछ इस तरह की कोशिश कर सकते हैं:

http://jsfiddle.net/orolo/wJDXL/

var longArray = [1, 2, 3, 4, 5, 6, 7, 8];

if (longArray.length >= 6) {
  longArray.length = 3;
}

alert(longArray); //1, 2, 3


2
हालांकि, मैं सरणी की शुरुआत से ट्रिम करने के लिए आवश्यक स्लाइस का उपयोग कर समाप्त हुआ, धन्यवाद।
addedlovely

3

जैसे @maerics ने कहा, आपकी लक्ष्य मशीन और ब्राउज़र प्रदर्शन का निर्धारण करेंगे।

लेकिन कुछ वास्तविक दुनिया की संख्याओं के लिए, मेरे 2017 एंटरप्राइज़ Chromebook पर, ऑपरेशन चल रहा है:

console.time();
Array(x).fill(0).filter(x => x < 6).length
console.timeEnd();
  • x=5e4 16ms लेता है, 60fps के लिए काफी अच्छा है
  • x=4e6 250ms लेता है, जो ध्यान देने योग्य है, लेकिन बड़ी बात नहीं है
  • x=3e7 1300ms लेता है, जो बहुत बुरा है
  • x=4e7 11000ms लेता है और अतिरिक्त 2.5GB मेमोरी आवंटित करता है

तो लगभग 30 मिलियन तत्व एक कठिन ऊपरी सीमा है, क्योंकि जावास्क्रिप्ट वीएम 40 मिलियन तत्वों पर एक चट्टान से गिरता है और संभवतः प्रक्रिया को दुर्घटनाग्रस्त कर देगा।


2

मैंने एक प्रदर्शन ढांचा बनाया है जो लाखों डेटासेट को हेरफेर और रेखांकन करता है, और फिर भी, जावास्क्रिप्ट गणना विलंबता दसियों मिलीसेकंड के आदेश पर थी। जब तक आप सरणी आकार सीमा पर जाने के बारे में चिंतित नहीं होते हैं, मुझे नहीं लगता कि आपके पास चिंता करने के लिए बहुत कुछ है।


0

यह बहुत ब्राउज़र पर निर्भर होगा। 100 आइटम एक बड़ी संख्या की तरह आवाज नहीं करते हैं - मुझे उम्मीद है कि आप इससे बहुत अधिक जा सकते हैं। हजारों को समस्या नहीं होनी चाहिए। एक समस्या क्या हो सकती है कुल मेमोरी खपत।


0

मैंने बेशर्मी से याददाश्त में कुछ बहुत बड़े डेटासेट खींचे हैं, और पूरी तरह से यह सुस्त हो गया है कि शायद डेटासेट पर बहुत गहन गणना के साथ डेटा के 15 मो को ऊपर की तरफ ले जाया गया है। मुझे संदेह है कि आप मेमोरी में समस्याओं में भाग लेंगे जब तक कि आपके पास डेटा और कई पंक्तियों पर गहन गणना न हो। विभिन्न नकली परिणाम के साथ रूपरेखा और बेंचमार्किंग प्रदर्शन का मूल्यांकन करने के लिए आपका सबसे अच्छा दांव होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.