জাভাস্ক্রিপ্টে একটি অ্যারের সর্বাধিক আকার


108

প্রসঙ্গ: আমি একটি ছোট সাইট তৈরি করছি যা একটি আরএসএস ফিড পড়ে এবং পটভূমিতে ফিডটি আপডেট / চেক করে। আমার প্রদর্শনের জন্য ডেটা সঞ্চয় করার জন্য একটি অ্যারে রয়েছে এবং অন্যটি আইডির রেকর্ড রয়েছে যা দেখানো হয়েছে।

প্রশ্ন: জিনিসগুলি ধীরগতিতে শুরু হওয়ার আগে বা অলস হওয়া শুরু করার আগে জাভাস্ক্রিপ্টে একটি অ্যারে কয়টি আইটেম ধরে রাখতে পারে। আমি অ্যারে বাছাই করছি না, তবে তুলনা করতে jQuery এর ইনআরে ফাংশন ব্যবহার করছি।

ওয়েবসাইটটি চলমান থাকবে এবং আপডেট হবে এবং ব্রাউজারটি প্রায়শই পুনরায় চালু / রিফ্রেশ হবে না এমন সম্ভাবনা।

যদি আমার অ্যারে থেকে কিছু রেকর্ড সাফ করার বিষয়ে চিন্তা করা উচিত তবে 100 আইটেমের মতো সীমাবদ্ধতার পরে কিছু রেকর্ড অপসারণ করার সর্বোত্তম উপায় কী।


3
আপনি সম্ভবত জেএস কোডের চেয়ে ব্রাউজারটি টুলবার থেকে মেমরি ফাঁস করে আরও সমস্যায় পড়বেন। :) ফায়ারফক্স 4 আমি আপনার দিকে আঙুল তুলি।
এপাসকেল্লো

1
আপনি কতবার অ্যারে পরীক্ষা করছেন (প্রাক্তন 2s ব্যবধান)? অলস (প্রাক্তন> 500 মিমি) কী গঠন করে? আপনার অ্যারেটির আকারটি কী আকারে রয়েছে (প্রাক্তন হাজার, মিলিয়ন, বিলিয়ন)?
zzzzBov


আমি প্রতি মিনিটে অ্যারেটি পরীক্ষা করে আপডেট করব। এবং হ্যাঁ আলস্য একটি পারফরম্যান্স হিট হবে যা সেই লোড এবং চেক এবং পৃষ্ঠাতে থাকা অন্যান্য অ্যানিমেশনগুলিকে প্রভাবিত করতে শুরু করে, দুঃখিতটির সংজ্ঞা দেওয়া শক্ত!
যোগসূত্রভাবে

এই লিঙ্কটির জন্য @ আমিন ধন্যবাদ, দেখে মনে হচ্ছে যে ওয়েবসাইটটি আমার নতুন সেরা বন্ধু হবে :)
যুক্তরাষ্ট্রে

উত্তর:


153

"এটি অলস হয়ে যায়" অবধি সর্বোচ্চ দৈর্ঘ্যটি আপনার টার্গেট মেশিন এবং আপনার প্রকৃত কোডের উপর সম্পূর্ণ নির্ভরশীল, তাই আপনাকে কী গ্রহণযোগ্য তা দেখার জন্য আপনাকে সেই (প্ল্যাটফর্মের) প্ল্যাটফর্মের পরীক্ষা করতে হবে।

তবে ECMA-262 5 তম সংস্করণ স্পেসিফিকেশন অনুসারে একটি অ্যারের সর্বাধিক দৈর্ঘ্য ToUint32 অ্যাবস্ট্রাক্ট অপারেশনের কারণে স্বাক্ষরবিহীন 32-বিট পূর্ণসংখ্যার দ্বারা আবদ্ধ , সুতরাং সবচেয়ে দীর্ঘতম অ্যারেটিতে 2 32 -1 = 4,294,967,295 = 4.29 বিলিয়ন উপাদান থাকতে পারে ।


13
@ বার্কর্ম্ন ০১: ইসিএমএ -২ 26২ তম সংস্করণের স্পেসিফিকেশন কোনও অপারেশনের অ্যারেটির দৈর্ঘ্য যাচাই করে তার দৈর্ঘ্য যাচাইয়ের জন্য ToUint32 ব্যবহার করে বিমূর্ত অপারেশন ব্যবহার করে , তাই আমি মনে করি মেশিনের অন্তর্নিহিত আর্কিটেকচার (বা ওয়েব ব্রাউজার) অপ্রাসঙ্গিক।
মায়ারিক্স

1
এইচআরএম খুব সুন্দরভাবে পড়ুন যে একটি দুর্দান্ত 64৪ বিট ব্রাউজার তখন অর্থহীন জ্বলজ্বল করছে,
বার্কার্ম্ন ০১

3
@ বার্কর্ম্ন ০১, bit৪ বিট ব্রাউজারগুলি এখনও আরও অনেক উন্নতি করেছে। মনে রাখবেন যে জাভাস্ক্রিপ্ট দোভাষী হওয়া কেবল ব্রাউজারের কাজ নয়।
রেজার ঝড়

1
ওয়াউজার আশা করেছিল যে এটি এত বেশি হবে। ঠিক আছে আমি মনে করি আমি ভাল থাকব!
যোগসূত্রভাবে

আসলে একটি অ্যারেতে সর্বাধিক 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
চতুর ধারণা, তবে এটি করার মাধ্যমে আপনি ডেটা ওভাররাইটের সম্ভাব্য, বিভ্রান্তিকর সূচকগুলি এবং সম্ভবত অদ্ভুত আচরণের ফলস্বরূপ।
জন কেটজিক

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
অ্যারে শুরু থেকে ছাঁটাই করার প্রয়োজন হিসাবে স্লাইস ব্যবহার করে শেষ হয়েছে, যদিও ধন্যবাদ thanks
যোগসূত্রে

3

@ মায়ারিকস যেমন বলেছেন, আপনার টার্গেট মেশিন এবং ব্রাউজার পারফরম্যান্স নির্ধারণ করবে।

তবে কিছু বাস্তব বিশ্ব সংখ্যার জন্য, আমার 2017 এন্টারপ্রাইজ Chromebook এ, অপারেশন চলছে:

console.time();
Array(x).fill(0).filter(x => x < 6).length
console.timeEnd();
  • x=5e4 16fms লাগে, 60fps এর জন্য যথেষ্ট ভাল
  • x=4e6 250 মিমি লাগে, এটি লক্ষণীয় তবে বড় চুক্তি নয়
  • x=3e7 1300ms লাগে, যা বেশ খারাপ
  • x=4e7 11000ms লাগে এবং অতিরিক্ত 2.5 গিগাবাইট মেমরি বরাদ্দ করে

সুতরাং প্রায় 30 মিলিয়ন উপাদান একটি শক্ত উপরের সীমা, কারণ জাভাস্ক্রিপ্ট ভিএম 40 মিলিয়ন উপাদানগুলিতে একটি ক্লিপ থেকে পড়ে এবং সম্ভবত প্রক্রিয়াটি ক্র্যাশ হয়ে যাবে।


2

আমি এমন একটি পারফরম্যান্স ফ্রেমওয়ার্ক তৈরি করেছি যা কয়েক মিলিয়ন ডেটাসেটকে ম্যানিপুলেট করে এবং গ্রাফ করে এবং তারপরেও জাভাস্ক্রিপ্ট গণনা ল্যাটেন্সি দশ মিলি সেকেন্ডের অর্ডারে ছিল। আপনি যদি অ্যারে আকারের সীমাটি অতিক্রম করার বিষয়ে উদ্বিগ্ন না হন তবে আপনার মনে হয় যে আপনার খুব বেশি চিন্তা করার দরকার নেই।


0

এটি খুব ব্রাউজার নির্ভর হবে। 100 টি আইটেম বড় সংখ্যার মতো শোনাচ্ছে না - আমি আশা করি আপনি এর থেকে অনেক বেশি যেতে পারেন। হাজার হাজারের সমস্যা হওয়া উচিত নয়। সমস্যা হতে পারে মোট মেমরি খরচ।


0

আমি নির্লজ্জভাবে স্মৃতিতে বেশ কয়েকটি বড় ডেটাসেট টেনে এনেছি এবং এটি অলস হয়ে উঠেছে সম্ভবত ডেটাসেটে বেশ তীব্র গণনা সহ 15 এমও ডেটা wardsর্ধ্বমুখী হয়েছে। আমি সন্দেহ করি যে আপনি যদি ডেটা এবং অনেকগুলি সারিতে নিবিড় গণনা না করেন তবে আপনি মেমরির সমস্যা নিয়ে চলে যাবেন। বিভিন্ন মক রেজাল্টস সহ প্রোফাইলিং এবং বেঞ্চমার্কিং পারফরম্যান্স মূল্যায়নের জন্য আপনার সেরা বাজি হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.