दिलचस्प पोस्ट
टेक्स्ट प्रॉपर्टी सेट करने के बाद UITextView शैली को रीसेट किया जा रहा है एक जार के अंदर एक फ़ाइल को संशोधित करना क्या एक विदेशी कुंजी स्वतः एक सूचकांक बनाती है? क्या रीडीम सुरक्षित करता है? '…' का कारण आंतरिक या बाहरी कमांड, ऑपरेटिव प्रोग्राम या बैच फ़ाइल के रूप में क्यों नहीं माना जाता है? मुख्य एनीमेशन प्रगति कॉलबैक सॉफ्टवेयर फ्रेमवर्क क्या है? जांचें कि क्या गैट में पुल की ज़रूरत है कई अन्य स्ट्रिंग्स के साथ एकाधिक स्ट्रिंग बदलें क्या करता है- D_XOPEN_SOURCE / क्या मतलब है? रिमोट गिट की शाखा मैं कैसे जांचूं? वेब एपीआई में प्रतिक्रिया को क्रमबद्ध करने में विफल रहा MySQL: रिकॉर्ड की मात्रा का एक प्रतिशत द्वारा LIMIT? IIS7 काम में जीज़िप कम्प्रेशन कैसे प्राप्त कर सकता है? एन्क्रिप्ट / डिक्रिप्ट फाइलों के लिए ओपनएसएसएल का उपयोग कैसे करें?

क्या मैं अपने ब्राउज़र में ऑब्जेक्ट्स के आकार की सीमाओं तक पहुंच सकता हूं, जो संभाल सकता है?

मैं अपने एचटीएमएल में <script> टैग्स में एक बड़ी सरणी को एम्बेड कर रहा हूँ, इस तरह (आश्चर्य की बात नहीं):

 <script> var largeArray = [/* lots of stuff in here */]; </script> 

इस विशेष उदाहरण में, सरणी में 210,000 तत्व हैं यह सैद्धांतिक अधिकतम 2 31 के नीचे – परिमाण के 4 आदेशों के अनुसार । यहां मजेदार भाग है: अगर मैं किसी फ़ाइल को सरणी के लिए जे एस स्रोत को सहेजता हूं, तो वह फाइल> 44 मेगाबाइट्स (46,573,39 9 बाइट्स सटीक होने के लिए)।

यदि आप खुद के लिए देखना चाहते हैं, तो आप इसे GitHub से डाउनलोड कर सकते हैं (इसमें सभी डेटा डिब्बाबंद होता है, इसमें से बहुत बार दोहराया जाता है। यह उत्पादन में मामला नहीं होगा।)

अब, मैं वास्तव में इतना डेटा देने के बारे में चिंतित नहीं हूँ मेरा सर्वर अपनी प्रतिक्रियाओं को जिप्प कर देता है, इसलिए यह वास्तव में तार पर डेटा प्राप्त करने के लिए इतना लंबा नहीं लेता है। हालांकि, ब्राउज़र को क्रैश करने के लिए, एक बार भरी हुई पेज के लिए एक बहुत बुरा प्रवृत्ति है। मैं IE में बिल्कुल भी परीक्षण नहीं कर रहा हूं (यह एक आंतरिक उपकरण है) मेरा प्राथमिक लक्ष्य क्रोम 8 और फ़ायरफ़ॉक्स 3.6 है।

फ़ायरफ़ॉक्स में, मैं कंसोल में काफी उपयोगी त्रुटि देख सकता हूं:

Error: script stack space quota is exhausted

क्रोम में, मैं बस दुखी-टैब पृष्ठ प्राप्त करता हूं:

यहां छवि विवरण दर्ज करें

पीछा करने के लिए कट, पहले से ही

  • क्या यह हमारे आधुनिक, "उच्च-प्रदर्शन" ब्राउज़रों को संभालने के लिए वास्तव में बहुत अधिक डेटा है?
  • क्या ऐसा कुछ है जो मैं बहुत अधिक डेटा को संभाल करने के लिए कर सकता हूं?

संयोग से, मैं यह काम करने के लिए (पढ़ने: टैब दुर्घटना) क्रोम में बंद और बंद करने में सक्षम था मैं सचमुच सोचा था कि क्रोम, कम से कम, मुश्किल सामान से बना था, लेकिन जाहिरा तौर पर मैं गलत था …


1 संपादित करें

@्रेयॉन: मैं यह सही नहीं दिख रहा था कि मैं एक बार में ब्राउज़र में इतना अधिक डेटा क्यों डंप करना चाहता हूं। लघु संस्करण: या तो मैं इस एक (निस्संदेह नहीं-आसान-आसान) समस्या का समाधान करता हूं, या मुझे अन्य समस्याएं पूरी तरह हल करने हैं मैं अभी के लिए सरल दृष्टिकोण का चयन कर रहा हूं

@ विविध: अभी, मैं विशेष रूप से सरणी में तत्वों की संख्या को कम करने के तरीकों की तलाश नहीं कर रहा हूं। मुझे पता है कि मैं अजाक्स पेजिंग को लागू कर सकता हूं या क्या-क्या है, लेकिन यह मेरे लिए अन्य समस्याओं के बारे में मेरे लिए समस्याओं का खुद का परिचय देता है।

@ फ़्राउज: प्रत्येक तत्व ऐसा कुछ दिखता है:

 {dateTime:new Date(1296176400000), terminalId:'terminal999', 'General___BuildVersion':'10.05a_V110119_Beta', 'SSM___ExtId':26680, 'MD_CDMA_NETLOADER_NO_BCAST___Valid':'false', 'MD_CDMA_NETLOADER_NO_BCAST___PngAttempt':0} 

@ होगा: लेकिन मेरे पास एक 4-कोर प्रोसेसर वाला कंप्यूटर, 6 गीगाबाइट रैम, डिस्क स्पेस के आधा टेराबाइट से अधिक है … और मैं ब्राउज़र के लिए यह जल्दी से करने के लिए नहीं कह रहा हूं – मैं बस पूछ रहा हूं यह बिल्कुल काम करने के लिए !


2 संपादित करें

मिशन पूरा हुआ!

जुआन और गुफा से स्पॉट-ऑन सुझावों के साथ, मुझे यह काम करने में सक्षम था! ऐसा प्रतीत होता है कि समस्या सिर्फ सोर्स कोड को पार्स करने में थी, वास्तव में इसके साथ मेमोरी में काम नहीं कर रहा था।

जुआन के जवाब पर टिप्पणी की तमाम बातें संक्षेप में प्रस्तुत करने के लिए: मुझे अपनी बड़ी सरणी को छोटे लोगों की एक श्रृंखला में विभाजित करना पड़ा, और फिर Array#concat() उन्हें, लेकिन यह पर्याप्त नहीं था मुझे उन्हें अलग-अलग बयानों में भी डालना पड़ा। इस कदर:

 var arr0 = [...]; var arr1 = [...]; var arr2 = [...]; /* ... */ var bigArray = arr0.concat(arr1, arr2, ...); 

इसे हल करने में योगदान देने वाले सभी लोगों के लिए: धन्यवाद। पहला दौर मुझ पर है!


* स्पष्ट के अलावा: ब्राउज़र को कम डेटा भेजना

वेब के समाधान से एकत्रित समाधान "क्या मैं अपने ब्राउज़र में ऑब्जेक्ट्स के आकार की सीमाओं तक पहुंच सकता हूं, जो संभाल सकता है?"

यहाँ मैं क्या कोशिश करूँगा: आपने कहा था कि यह एक 44 एमबी फाइल है। यह निश्चित रूप से 44 एमबी स्मृति से ज्यादा लेता है, मुझे लगता है कि यह 44 एमबी रैम से ज्यादा लेता है, शायद आधा गिग। जब तक ब्राउज़र क्रैश नहीं हो जाता है तब तक आप डेटा काट कर सकते हैं और देख सकते हैं कि ब्राउज़र कितनी मेमोरी का उपयोग करता है?

यहां तक ​​कि सर्वर पर चलने वाले ऐप्स को अच्छी तरह से सेवा प्रदान की जाती है ताकि 44MB फाइल नहीं पढ़ी जा सके और इसे स्मृति में रखा जा सके। यह सब कहने के बाद, मेरा मानना ​​है कि ब्राउज़र को इसे संभालने में सक्षम होना चाहिए, तो मुझे कुछ परीक्षण चलाने दें।

(विंडोज 7, 4 जीबी मेमोरी का उपयोग करना)

पहला टेस्ट मैंने आधे में सरणी काट दिया और कोई समस्या नहीं थी, 80 एमबी का इस्तेमाल किया, कोई दुर्घटना नहीं हुई

दूसरा टेस्ट मैंने सरणी को दो अलग-अलग एरे में विभाजित किया, लेकिन अभी भी सभी डेटा शामिल हैं, 160 एमबी का उपयोग करता है, कोई क्रैश नहीं

तीसरा टेस्ट के बाद से फ़ायरफ़ॉक्स ने कहा कि यह स्टैक से बाहर निकल गया था, समस्या शायद यह है कि यह एक बार में सरणी को पार्स नहीं कर सकती है। मैंने दो अलग-अलग arrays, arr1, arr2 बनाया है, तो arr3 = arr1.concat (arr2) किया था; यह ठीक भाग गया और केवल थोड़ा अधिक स्मृति का उपयोग करता है, लगभग 165MB

चौथा टेस्ट मैं उन 7 arrays (22MB प्रत्येक) का निर्माण कर रहा हूं और ब्राउज़र की सीमाओं का परीक्षण करने के लिए उन्हें सम्मिलित कर रहा हूं। लोडिंग को समाप्त करने के लिए पृष्ठ को लगभग 10 सेकंड लगते हैं। मेमोरी 1.3 जीबी तक बढ़ जाती है, फिर इसे 500 एमबी तक वापस चला जाता है तो हाँ क्रोम इसे संभाल सकता है यह इसे एक बार में सभी को पार्स नहीं कर सकता क्योंकि यह किसी तरह के पुनरावर्ती का उपयोग करता है जैसा कि कन्सोल के त्रुटि संदेश द्वारा देखा जा सकता है

उत्तर अलग सरणियों (प्रत्येक 20 एमबी से कम) बनाएं और फिर उन्हें सम्मिलित करें। प्रत्येक सरणी को अपने var स्टेटमेंट पर होना चाहिए, एक एकल var के साथ कई घोषणाओं के बजाय।

मैं अभी भी केवल आवश्यक हिस्सा लाने पर विचार करेगा, यह ब्राउज़र सुस्त बना सकता है। हालांकि, अगर यह आंतरिक कार्य है, तो यह ठीक होना चाहिए।

अंतिम बिंदु: आप अधिकतम स्मृति स्तर पर नहीं हैं, केवल अधिकतम पार्सिंग स्तर।

हां, ब्राउज़र के बारे में पूछने के लिए बहुत ज्यादा है

डेटा की वह राशि विनियमित होगी यदि वह पहले से ही डेटा था, लेकिन यह अभी तक डेटा नहीं है। विचार करें कि ब्राउजर को स्रोत कोड के उस विशाल ब्लॉक को पार्स करना है, जबकि यह जाँचते हुए कि वाक्यविन्यास सभी के लिए जोड़ता है। एक बार मान्य कोड में पार्स करने के बाद, कोड को वास्तविक सरणी का निर्माण करने के लिए चलाना होगा।

इसलिए, सभी डेटा एक ही बार में (कम से कम) दो या तीन संस्करणों में मौजूद होंगे, प्रत्येक एक अतिरिक्त मात्रा के साथ। सरणी शब्दशः एक एकल कथन के रूप में, प्रत्येक चरण में सभी डेटा शामिल करना होगा।

डेटा को कई छोटे सरणियों में बांटना संभवतः ब्राउज़र पर संभव बनाता है

एक JSON पृष्ठ के रूप में अजाक्स के साथ डेटा पुनर्प्राप्त करने का प्रयास करें। मुझे सटीक आकार नहीं पता है, लेकिन मैं इस तरह Google क्रोम में बड़ी मात्रा में डेटा खींचने में सक्षम हूं।

क्या आपको वास्तव में सभी डेटा की आवश्यकता है? क्या आप वर्तमान में एजेएक्स के ज़रिए उपयोग किए जाने वाले डेटा को स्ट्रीम नहीं कर सकते हैं? Google मानचित्र के समान – आप सभी मानचित्र डेटा को ब्राउज़र की मेमोरी में फिट नहीं कर सकते हैं, वे केवल उस भाग को प्रदर्शित करते हैं जो आप वर्तमान में देख रहे हैं।

याद रखें कि 40 मेगाहर्टज के हार्ड डेटा को ब्राउज़र के आंतरिक प्रतिनिधित्व में और अधिक बढ़ाया जा सकता है। उदाहरण के लिए जेएस दुभाषिया सरणी को लागू करने के लिए हैशटेबल का उपयोग कर सकते हैं, जो अतिरिक्त स्मृति ओवरहेड जोड़ देगा। इसके अलावा, मुझे उम्मीद है कि ब्राउजर दोनों स्रोत कोड और जेएस मेमोरी को स्टोर करते हैं, जो कि डेटा की मात्रा को दुगुना करते हैं।

जेएस को क्लाइंट-साइड यूआई इंटरैक्शन प्रदान करने के लिए डिज़ाइन किया गया है, डेटा लोड नहीं करना

संपादित करें:

बीटीडब्ल्यू, क्या आप वास्तव में सोचते हैं कि उपयोगकर्ता 40 मेगाबाइट मूल्य कोड डाउनलोड करना चाहेंगे? ब्रॉडबैंड इंटरनेट एक्सेस के मुकाबले अब भी कई उपयोगकर्ता हैं और सभी डेटा डाउनलोड होने तक स्क्रिप्ट के निष्पादन को निलंबित कर दिया जाएगा।

EDIT2:

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

मुझे लगता है कि प्रदर्शन बेहतर होगा यदि यह आदिम डेटा का सरल वेक्टर था।

EDIT3: डेटा निश्चित रूप से सरलीकृत किया जा सकता है। इसका बड़ा हिस्सा दोहराए जाने वाले तार हैं, जो किसी तरह पूर्णांक या किसी चीज़ के रूप में एन्कोड किया जा सकता है। इसके अलावा, मेरे ओपेरा को सिर्फ पाठ प्रदर्शित करने में परेशानी हो रही है, अकेले इसे व्याख्या कीजिए।

EDIT4: दिनांक समय वस्तुओं को भूल जाओ ! यूनिक्स युग टाइमस्टैम्प या स्ट्रिंग का उपयोग करें, लेकिन ऑब्जेक्ट नहीं!

EDIT5: आपका प्रोसेसर कोई फर्क नहीं पड़ता क्योंकि जेएस एकल-थ्रेडेड है। और आपके रैम में कोई फर्क नहीं पड़ता है, अधिकांश ब्राउज़रों 32 बिट हैं, इसलिए वे उस मेमोरी का अधिक उपयोग नहीं कर सकते।

EDIT6: अनुक्रमिक पूर्णांकों (0, 1, 2, 3 …) के लिए सरणी सूचकांक बदलने की कोशिश करें इससे ब्राउज़र को अधिक कुशल सरणी डेटा संरचना का उपयोग करना पड़ सकता है। आप सरणी वस्तुओं को कुशलतापूर्वक उपयोग करने के लिए स्थिरांक का उपयोग कर सकते हैं। यह विशाल हिस्से द्वारा सरणी आकार को कम करने वाला है।

आलसी लोडिंग का उपयोग करें डेटा के लिए संकेत मिलता है और इसे प्राप्त करने पर उपयोगकर्ता पूछता है।

इस तकनीक का उपयोग लाखों रिकॉर्ड डेटा के प्रबंधन के लिए विभिन्न स्थानों में किया जाता है।

[संपादित करें]

मैंने वह पाया जिसकी मुझे तलाश थी। Jqgrid में वर्चुअल स्क्रॉलिंग यह 500k रिकॉर्ड आलसी लोड किया जा रहा है।

मैं प्रत्येक "आइटम" के बीच विभाजक के रूप में एक बड़ी स्ट्रिंग के रूप में होने की कोशिश करता हूं तो split उपयोग करें, जैसे कुछ:

 var largeString = "item1,item2,......."; var largeArray = largeString.split(","); 

उम्मीद है कि स्ट्रिंग इतनी तेज़ी से ढेर नहीं निकालेगा

संपादित करें: इसका परीक्षण करने के लिए मैंने 200,000 सरल वस्तुओं (प्रत्येक आइटम एक नंबर) के साथ डमी सरणी बनाई और क्रोम ने इसे तत्काल अंदर लोड किया 2,000,000 आइटम? कुछ सेकंड लेकिन कोई दुर्घटना नहीं 6,000,000 आइटम ऐरे (50 एमबी फ़ाइल) ने लगभग 10 सेकंड के लिए क्रोम लोड किया, लेकिन फिर भी, किसी भी तरीके से कोई दुर्घटना नहीं हुई।

इसलिए यह मुझे विश्वास करने की ओर ले जाता है कि समस्या ही सरणी के साथ नहीं है, बल्कि इसकी सामग्री है .. सामग्री को साधारण वस्तुओं में ऑप्टिमाइज़ करने के बाद उन्हें "फ़्लाई पर" पार्स करें और इसे काम करना चाहिए।