একটি জাভাস্ক্রিপ্ট অবজেক্টের আকার কীভাবে পাবেন?


296

আমি একটি জাভাস্ক্রিপ্ট অবজেক্ট দ্বারা দখল করা আকারটি জানতে চাই।

নিম্নলিখিত ফাংশন নিন:

function Marks(){
  this.maxMarks = 100;
}

function Student(){
  this.firstName = "firstName";
  this.lastName = "lastName";
  this.marks = new Marks();
}

এখন আমি তাত্ক্ষণিকভাবে student:

var stud = new Student();

যাতে আমি মত জিনিস করতে পারি

stud.firstName = "new Firstname";

alert(stud.firstName);

stud.marks.maxMarks = 200;

প্রভৃতি

এখন, studবস্তুটি মেমরির কিছু আকার দখল করবে। এটিতে কিছু ডেটা এবং আরও অবজেক্ট রয়েছে।

আমি কীভাবে আবিষ্কার করব যে studবস্তুটি কত স্মৃতি ধারণ করে? sizeof()জাভাস্ক্রিপ্ট এর মত কিছু ? সত্যিই দুর্দান্ত লাগবে যদি আমি কোনও ফাংশন কলের মতো এটির সন্ধান করতে পারি sizeof(stud)

আমি কয়েক মাস ধরে ইন্টারনেট অনুসন্ধান করছি find এটি খুঁজে পাইনি (কয়েক ফোরামে জিজ্ঞাসা করা হয়েছিল। কোনও উত্তর নেই)।


41
জাভাস্ক্রিপ্টে আমার কোনও অবজেক্টের আকার খুঁজে বের করার জন্য অনেকগুলি কারণ রয়েছে (উত্থান হবে)। আমি জাভাস্ক্রিপ্টে নতুন তাই আমি সেরা অনুশীলনগুলি অনুসরণ করি না। আমি এখনও তাদের শিখছি। আমি একটি ফায়ারফক্স এক্সটেনশন তৈরি করেছি যা আমি নিশ্চিত যে এটি করা উচিত তার চেয়ে বেশি মেমরি ব্যবহার করছে। আমি মেমরির ব্যবহার কমাতে (আশাবাদী) কিছু উপায় নিয়ে কাজ করছি .. আমি ট্যাব প্রতি হাজারে উদাহরণের অনেকগুলি বিষয় নিয়ে কথা বলছি, তাই স্মৃতিটি গুরুত্বপূর্ণ! জিনিসটি হ'ল আমি জানতে চাই যে আমার স্মৃতি হ্রাস করার চেষ্টাগুলি আসলে স্মৃতি হ্রাস করতে সহায়তা করে .. এবং কতটা দ্বারা।

1
যদি আপনি কোনও এফএফ এক্সটেনশন তৈরি করে থাকেন তবে আমি আপনাকে জেএসের চেয়ে উচ্চতর ভাষার স্তরে তদন্ত করার পরামর্শ দিচ্ছি - দেখুন এফএফের নিজেই কী প্রভাব ফেলবে।
অনাকাটা

2
জেএসের চেয়ে উচ্চ স্তরের ভাষা? এই ক্ষেত্রে কি হবে?

24
এটি যে আকারেই গুরুত্বপূর্ণ তা আকার নয়। এটি আপনি এটি ব্যবহার কিভাবে। পিএস: কি স্টাড!
টমাস এডিং

13
@ স্পেনসারআরউপ্ট এক নম্বর কারণ হ'ল HTML5 অফলাইন সক্ষম অ্যাপ্লিকেশনগুলির যেখানে আপনার মাঝে মাঝে সীমাবদ্ধ স্থান সীমাবদ্ধ থাকে (5-10Mb ডেটা নিবিড় অ্যাপ্লিকেশনের জন্য দ্রুত খাওয়া যায়)।
ডেভিড

উত্তর:


181

আমি আমার মূল উত্তরে কোডটি পুনরায় ফ্যাক্টর করেছি । আমি পুনরাবৃত্তি সরিয়ে এবং অনুমান করা অস্তিত্বকে ওভারহেড সরিয়ে দিয়েছি।

function roughSizeOfObject( object ) {

    var objectList = [];
    var stack = [ object ];
    var bytes = 0;

    while ( stack.length ) {
        var value = stack.pop();

        if ( typeof value === 'boolean' ) {
            bytes += 4;
        }
        else if ( typeof value === 'string' ) {
            bytes += value.length * 2;
        }
        else if ( typeof value === 'number' ) {
            bytes += 8;
        }
        else if
        (
            typeof value === 'object'
            && objectList.indexOf( value ) === -1
        )
        {
            objectList.push( value );

            for( var i in value ) {
                stack.push( value[ i ] );
            }
        }
    }
    return bytes;
}

35
আপনি অবজেক্ট কীগুলিও ভাবতে চাইতে পারেন
zupa

8
যে কেউ এখানে মিথ্যা / সত্যের উদ্দেশ্যে ক্ষুদ্রতম প্রকারের সন্ধানে অবতরণ করেছে, মনে হয় এটি অপরিজ্ঞাত / নাল।
zupa

3
"よんもじ".lengthজাভাস্ক্রিপ্টে 4 হয়, তবে আপনি কি নিশ্চিত যে এটি 8 বাইট, আপনার কোডটি এটি ফেরত দেওয়ার কারণে?
syockit

8
হাঁ। জাভাস্ক্রিপ্টে অক্ষরগুলি ইসিএমএ -262
-পিটার

4
এই ফাংশনটি ক্লোজারগুলিতে লুকানো রেফারেন্স গণনা করে না। উদাহরণস্বরূপ var a={n:1}; var b={a:function(){return a}}; roughSizeOfObject(b)- এখানে bরেফারেন্স ধারণ করে a, তবে roughSizeOfObject()ফেরত দেয় 0
রোমান পোমিনোভ

116

গুগল ক্রোম হিপ প্রোফাইলার আপনাকে অবজেক্ট মেমরির ব্যবহার পরীক্ষা করার অনুমতি দেয়।

আপনার ট্রেসটিতে অবজেক্টটি সনাক্ত করতে সক্ষম হতে হবে যা জটিল হতে পারে। আপনি যদি উইন্ডোটি বিশ্বব্যাপী অবজেক্টটিকে পিন করেন তবে "ধারক" তালিকা মোড থেকে এটি পাওয়া বেশ সহজ।

সংযুক্ত স্ক্রিনশটটিতে, আমি উইন্ডোতে "testObj" নামে একটি বস্তু তৈরি করেছি। আমি তারপরে প্রোফাইলে অবস্থিত (রেকর্ডিং তৈরির পরে) এবং এটি অবজেক্টের পুরো আকার এবং এটিতে "রক্ষিত আকার" এর অধীনে সমস্ত কিছু দেখায়।

স্মৃতি ভেঙে যাওয়ার আরও বিশদ

ক্রোম প্রোফাইলার

উপরের স্ক্রিনশটে, অবজেক্টটি 60 টি ধরে রাখার আকার দেখায় I আমি বিশ্বাস করি ইউনিটটি এখানে বাইট।


13
এই উত্তরটি আমার সমস্যার পাশাপাশি সমাধান করেছে: developers.google.com/chrome-developer-tools/docs/… । দ্রুত টিপ: দ্রুত হিপ স্ন্যাপশট নিন, আপনার সন্দেহজনক যে কাজটি ফাঁস হচ্ছে সেটিকে চালনা করুন, একটি নতুন দ্রুত হিপ স্ন্যাপশট নিন এবং comparisonনীচে দৃশ্যটি নির্বাচন করুন । এটি স্পষ্ট করে দেয় যে দুটি স্ন্যাপশটের মধ্যে কী কী বস্তু তৈরি হয়েছিল।
জনরাইড

1
এটি সম্ভবত সবচেয়ে পরিষ্কার সমাধান।
লুকা স্টেব

@ জনরাইড দ্বারা উল্লিখিত তুলনাটি এখন শীর্ষে একটি ডাউন ডাউন মেনু।
ফ্রেন্ড্রয়েড

Shallow sizeউভয় { a:"55c2067aee27593c03b7acbe", b:"55c2067aee27593c03b7acbe", c:null, d:undefined }এবং { c:null, d:undefined }অবজেক্টের জন্য 40 হিসাবে মনে হচ্ছে । ঠিক আছে?
এফকান

1
আপনি নোড থেকেও গুগল ক্রোম হ্যাপ প্রোফাইলার ব্যবহার করতে পারেন। আপনার যদি নোড ভি 8 বা তার বেশি থাকে তবে এটি node --inspectক্রোম দিয়ে এবং Chrome about:inspectএ শুরু করে URL বারে প্রবেশ করুন এবং নোড পরিদর্শক খোলার জন্য সন্ধান করুন। নোড সিএলআইতে আপনার অবজেক্ট তৈরি করুন এবং তারপরে একটি হিপ স্ন্যাপশট নিন।
গ্রেগোর

74

আমি কেবল এটি একটি অনুরূপ (ইশ) সমস্যা সমাধানের জন্য লিখেছি। এটি আপনি যা খুঁজছেন তা হুবহু করে না, অর্থাত্ দোভাষী কীভাবে সেই জিনিসটি সঞ্চয় করে তা বিবেচনায় নেই।

তবে, আপনি যদি ভি 8 ব্যবহার করে থাকেন তবে এটি আপনার ভয়ঙ্কর প্রোটোটাইপিং এবং লুক্কায়িত ক্লাসগুলির বেশিরভাগ ওভারহেড চাটানোর কারণে মোটামুটি ঠিক appro

function roughSizeOfObject( object ) {

    var objectList = [];

    var recurse = function( value )
    {
        var bytes = 0;

        if ( typeof value === 'boolean' ) {
            bytes = 4;
        }
        else if ( typeof value === 'string' ) {
            bytes = value.length * 2;
        }
        else if ( typeof value === 'number' ) {
            bytes = 8;
        }
        else if
        (
            typeof value === 'object'
            && objectList.indexOf( value ) === -1
        )
        {
            objectList[ objectList.length ] = value;

            for( i in value ) {
                bytes+= 8; // an assumed existence overhead
                bytes+= recurse( value[i] )
            }
        }

        return bytes;
    }

    return recurse( object );
}

1
@ লিয়াংলিং জেং - দুর্দান্ত পয়েন্ট অসীম লুপ, ধন্যবাদ। আশা করি আপনি কিছু মনে করবেন না যদি আমি এটি কিছুটা পুনরায় জিগ করি এবং কাজের পরে আমার আপডেট (?)
থোমাস-পিটার

আমি আজ রাতে নোড.জেএস দিয়ে বেঞ্চ পরীক্ষা করতে যাচ্ছি এবং জায়গাটিতে আরও ভাল গুণফল পেতে চলেছি।
থোমাস-পিটার

'বাইটস + = পুনরাবৃত্তি (মান [i])' লাইনটি, আমার এফএফ 14.01 এ একটি ত্রুটি ছুড়ে ফেলেছে: এনএস_আরআর_ফিলার: উপাদান ব্যর্থতা কোডটি ফেরত দিয়েছে: 0x80004005 (এনএস_আরআর_আরএফআইএল) [nsIDOMHTMLInputElement.selectionStart]। আমার অবজেক্টের একটিতে, আমি যদি অন্যরকম চেষ্টা করি তবে তা হয় না, সম্ভবত একটি ব্রাউজার বাগ, বা কোড প্রতিটি বস্তুর জন্য কাজ করে না (যেটি কাজ করে না তার মধ্যে ফাংশন রয়েছে, যা কাজ করে না ' t)
ট্রাইস্পেস

1
এক টম থেকে অন্য টমকে, এটি আমার কার্যকর বস্তুটির কোমরেখাগুলি ছাঁটাই করার দরকারের একটি রুক্ষ সূচক হিসাবে দুর্দান্ত কার্যকর হয়েছিল। সুতরাং আপনার মিসাস জাভাস্ক্রিপ্টের সাথে আপনার সম্পর্ক সম্পর্কে জানতে পেরেছিল? তিনি একজন উচ্চ রক্ষণাবেক্ষণের উপপত্নী।
টম ডব্লিউ হল

4
এটি পিএইচপি (গল্প) এর জন্য আমাকে সন্ধান করতে হবে - আমি তাকে অনেক আগে প্রেম বন্ধ করে দিয়েছিলাম তবে তিনি বিলগুলি প্রদান করে। যাইহোক, ধন্যবাদ টম, প্রতিক্রিয়া যা সুনামের পয়েন্টগুলির চেয়ে ভাল।
থোমাস-পিটার

55

কখনও কখনও আমি এটি সত্যই বড় অবজেক্টগুলিকে ফ্ল্যাগ করতে ব্যবহার করি যা সার্ভার থেকে ক্লায়েন্টের কাছে যেতে পারে। এটি মেমরি পদক্ষেপের প্রতিনিধিত্ব করে না। এটি পাঠাতে, বা এটি সঞ্চয় করতে ব্যয় করতে চাইলে এটি আপনাকে প্রায় দেয়।

আরও মনে রাখবেন, এটি ধীর, কেবলমাত্র দেব। তবে এক লাইনের কোডের সাথে একটি বলপার্ক উত্তর পাওয়ার জন্য এটি আমার পক্ষে কার্যকর।

roughObjSize = JSON.stringify(bigObject).length;

2
আমার পরীক্ষাগুলি থেকে, এই পদ্ধতিটি অবজেক্ট-আকারের ক্ষেত্রেের চেয়ে বেশ দ্রুততর কারণ এটিতে লোডাসের থেকে ধীর _.isObject () কল নেই। এছাড়াও ফিরে আসা মাপগুলি মোটামুটি অনুমানের জন্য তুলনীয়। সংক্ষিপ্ত বিবরণ gist.github.com/owenallenaz/ff77fc98081708146495
নিউক্লিওন


5
বিজ্ঞপ্তিযুক্ত কাঠামো সহ ব্যবহার করতে পারবেন না VM1409:1 Uncaught TypeError: Converting circular structure to JSON:( এখনও কার্যকর
givanse

এটি বাইটে বাইনারি আকার নয় তবে আনুমানিক আকার পেতে ব্যবহার করা সহজ
ডাটডিনহোকোক

এটি দুর্দান্ত তবে যদি 1) আপনার কেবল একটি বলপার্কের প্রাক্কলন প্রয়োজন 2) আপনি জানেন যে আপনার কোনও বৃত্তাকার উল্লেখ নেই 3) আপনি বড় মূল্যবোধগুলি বাদ দিতে পারেন এবং এগুলি পৃথকভাবে মেসেজ করতে পারেন। এই সমস্ত আমার ক্ষেত্রে সত্য ছিল তাই নিখুঁতভাবে কাজ করে, আমার কেবলমাত্র এক জায়গায় একটি বড় স্ট্রিং ছিল যা আমি কেবল দৈর্ঘ্যটি পরিমাপ করতে পারি।
ওজজিআই

43

এখানে সমস্যার আরও কিছুটা কমপ্যাক্ট সমাধান রয়েছে:

const typeSizes = {
  "undefined": () => 0,
  "boolean": () => 4,
  "number": () => 8,
  "string": item => 2 * item.length,
  "object": item => !item ? 0 : Object
    .keys(item)
    .reduce((total, key) => sizeOf(key) + sizeOf(item[key]) + total, 0)
};

const sizeOf = value => typeSizes[typeof value](value);

3
সুতরাং এই কেবি আকার? বা বিটস?
ভিনসেন্ট থর্প

2
@ ভিনসেন্ট-থর্প এটি বাইটে রয়েছে।
ড্যান

2
চমৎকার স্ক্রিপ্ট, যদিও চক্রীয় রেফারেন্সের জন্য পরিবর্তন প্রয়োজন।
জিম পেডিড

1
আমি কেবল একটি নোড প্রক্রিয়াটির মধ্যে ডেটাগুলির বিশাল অ্যারেতে আপনার অ্যালগরিদমটি পরীক্ষা করেছি, এটি 13 গিগাবাইটের প্রতিবেদন করেছে, তবে নোড 22 গিগাবাইট গ্রহণ করছে, পার্থক্যটি কোথা থেকে আসে সে সম্পর্কে কোনও ধারণা? স্মৃতিতে আর কিছুই নেই।
জোসু গোসি

3
@ জোসুগোই, তারা হিসাব করে না যে বস্তু নিজে থেকে কত পরিমাণে নেয়, কেবল তার মান। সমস্ত বস্তু কেবল তাদের মানের চেয়ে বেশি স্থান নেয়, অন্যথায় typeof ...এটি কাজ করবে না।
অ্যালেক্সিস উইল্ক

42

বস্তুর আকার পেতে একটি এনপিএম মডিউল রয়েছে , আপনি এটি দিয়ে এটি ইনস্টল করতে পারেনnpm install object-sizeof

  var sizeof = require('object-sizeof');

  // 2B per character, 6 chars total => 12B
  console.log(sizeof({abc: 'def'}));

  // 8B for Number => 8B
  console.log(sizeof(12345));

  var param = { 
    'a': 1, 
    'b': 2, 
    'c': {
      'd': 4
    }
  };
  // 4 one two-bytes char strings and 3 eighth-bytes numbers => 32B
  console.log(sizeof(param));

আকারের (নতুন তারিখ ()) === 0 এবং মাপের ({=) === 0. এটি কি উদ্দেশ্য?
ফিলিপ ক্লেন

1
@ ফিলিপক্লেন স্পষ্টতই এটি is উভয় বস্তুর কোনও বৈশিষ্ট্য নেই।
রবার্ট

18

এটি একটি হ্যাকি পদ্ধতি, তবে আমি এটি বিভিন্ন সংখ্যার সাথে দুবার চেষ্টা করেছি এবং এটি সুসংগত বলে মনে হচ্ছে।

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

function Marks()
{
  this.maxMarks = 100;
}

function Student()
{
  this.firstName = "firstName";
  this.lastName = "lastName";
  this.marks = new Marks();
}

var manyObjects = new Array();
alert('before');
for (var i=0; i<2000000; i++)
    manyObjects[i] = new Student();
alert('after');

আমি এটি আমার কম্পিউটারে চেষ্টা করেছি এবং "পূর্বে" সতর্কতা দেখানো হলে প্রক্রিয়াটির 48352K মেমরি ছিল। বরাদ্দের পরে, ফায়ারফক্সের 440236K মেমরি ছিল। 2 মিলিয়ন বরাদ্দের জন্য, এটি প্রতিটি বস্তুর জন্য প্রায় 200 বাইট।

আমি এটি আবার 1 মিলিয়ন বরাদ্দের দিয়ে চেষ্টা করেছি এবং ফলাফলটি একই রকম ছিল: প্রতি বস্তু অনুসারে 196 বাইট (আমি মনে করি 2 মিলিতে অতিরিক্ত ডেটা অ্যারের জন্য ব্যবহৃত হয়েছিল)।

সুতরাং, এখানে একটি হ্যাকি পদ্ধতি যা আপনাকে সাহায্য করতে পারে। জাভাস্ক্রিপ্ট কোনও কারণে "আকারের" পদ্ধতি সরবরাহ করে না: প্রতিটি জাভাস্ক্রিপ্ট বাস্তবায়ন আলাদা is গুগল ক্রোমে উদাহরণস্বরূপ একই পৃষ্ঠায় প্রতিটি বস্তুর জন্য প্রায় 66 বাইট ব্যবহার করা হয় (কমপক্ষে টাস্ক ম্যানেজারের কাছ থেকে বিচার করা)।


আরে .. কৌশলটির জন্য ধন্যবাদ। আমার কাছে ছিল যে পরিকল্পনা বি হিসাবে মেমরির ব্যবহার পরিমাপের জন্য সরাসরি কোনও উপায় ছিল না।

4
প্রতিটি সি এবং সি ++ বাস্তবায়নও আলাদা। ;) সি বা সি ++ তে কোনও ডেটা ধরণের আকার বাস্তবায়ন নির্দিষ্ট। আমি জাভাস্ক্রিপ্ট যেমন কোনও অপারেটরকে সমর্থন করতে পারে না তার কারণ দেখছি, যদিও এটি সি বা সি ++ (যা নিম্ন-স্তরের ভাষাগুলি এবং একটি স্থির- এর প্রকৃত আকার পরিমাপ করে) এর মতো একই উদ্দেশ্য ব্যবহার করে না বা একই অর্থ ব্যবহার করবে না though সংকলন সময়ে আকারের ডেটা টাইপ হিসাবে রান-টাইমে গতিশীল জাভাস্ক্রিপ্ট অবজেক্টের পরিবর্তনশীল-আকারের বিপরীতে)।
bambams

12

দুঃখিত আমি কোন মন্তব্য করতে পারিনি, তাই আমি কেবল টমরং থেকে কাজ চালিয়ে যাচ্ছি। এই বর্ধিত সংস্করণটি একাধিকবার অবজেক্টকে গণনা করবে না, সুতরাং অসীম লুপ নেই। এছাড়াও, আমি গণনা করি যে কোনও বস্তুর কীটিও মোটামুটি গণনা করা উচিত।

function roughSizeOfObject( value, level ) {
    if(level == undefined) level = 0;
    var bytes = 0;

    if ( typeof value === 'boolean' ) {
        bytes = 4;
    }
    else if ( typeof value === 'string' ) {
        bytes = value.length * 2;
    }
    else if ( typeof value === 'number' ) {
        bytes = 8;
    }
    else if ( typeof value === 'object' ) {
        if(value['__visited__']) return 0;
        value['__visited__'] = 1;
        for( i in value ) {
            bytes += i.length * 2;
            bytes+= 8; // an assumed existence overhead
            bytes+= roughSizeOfObject( value[i], 1 )
        }
    }

    if(level == 0){
        clear__visited__(value);
    }
    return bytes;
}

function clear__visited__(value){
    if(typeof value == 'object'){
        delete value['__visited__'];
        for(var i in value){
            clear__visited__(value[i]);
        }
    }
}

roughSizeOfObject(a);

আমি মনে করি এটি কীগুলি গণনা করার কারণে এটি আরও নির্ভুল, যদিও এটি '__visited__' কী গণনা করে
স্যাম হাসলার

চেকিং typeof value === 'object'যথেষ্ট নয় এবং মানটি থাকলে আপনার ব্যতিক্রম হবে null
ফ্লোরিবন

@ টমরংয়ের ছদ্মবেশী উত্তরগুলির সাথে তুলনা করে এটি আমার অবজেক্টের জন্য দ্রুত প্রস্ফুটিত ছিল (যা আমি খুব আত্মবিশ্বাসী) এটি আরও সঠিক ছিল (এটি 3 এমবি বা ততক্ষণ বলেছে) তবে এখনও বাস্তব থেকে অনেক দূরে। এটি গণনা করা হতে পারে না কি সম্পর্কে কোন সূত্র?
ক্রেগক্স

আমার জন্য কাজ করে না। অবজেক্টে levelডেটা রয়েছে তবে roughSizeOfObject(level)শূন্য ফিরে আসে। (আমার পরিবর্তনশীল স্তরটি অবশ্যই আপনার যুক্তি দিয়ে বিভ্রান্ত হবে না I অবশ্যই আমি মনে করি না যে ভেরিয়েবল শেডিংয়ের কারণে এখানে কোনও সমস্যা হওয়া উচিত এবং আমি যখন আপনার স্ক্রিপ্টে 'স্তর' নামকরণ করি তখনও আমি একই ফল পাই)) স্ক্রিনশট : snipboard.io/G7E5yj.jpg
লুক

10

একই সমস্যা হচ্ছে। আমি গুগলে অনুসন্ধান করেছি এবং আমি এই সমাধানটি স্ট্যাকওভারফ্লো সম্প্রদায়ের সাথে ভাগ করতে চাই।

গুরুত্বপূর্ণ :

আমি গিথুব https://gist.github.com/zensh/4975495 এ ইয়ান কিং দ্বারা ভাগ করা ফাংশনটি ব্যবহার করেছি

function memorySizeOf(obj) {
    var bytes = 0;

    function sizeOf(obj) {
        if(obj !== null && obj !== undefined) {
            switch(typeof obj) {
            case 'number':
                bytes += 8;
                break;
            case 'string':
                bytes += obj.length * 2;
                break;
            case 'boolean':
                bytes += 4;
                break;
            case 'object':
                var objClass = Object.prototype.toString.call(obj).slice(8, -1);
                if(objClass === 'Object' || objClass === 'Array') {
                    for(var key in obj) {
                        if(!obj.hasOwnProperty(key)) continue;
                        sizeOf(obj[key]);
                    }
                } else bytes += obj.toString().length * 2;
                break;
            }
        }
        return bytes;
    };

    function formatByteSize(bytes) {
        if(bytes < 1024) return bytes + " bytes";
        else if(bytes < 1048576) return(bytes / 1024).toFixed(3) + " KiB";
        else if(bytes < 1073741824) return(bytes / 1048576).toFixed(3) + " MiB";
        else return(bytes / 1073741824).toFixed(3) + " GiB";
    };

    return formatByteSize(sizeOf(obj));
};


var sizeOfStudentObject = memorySizeOf({Student: {firstName: 'firstName', lastName: 'lastName', marks: 10}});
console.log(sizeOfStudentObject);

আপনি এটি সম্পর্কে কি মনে করেন?


3
এটি ফাংশন মিস করে। যদি আমি কোনও ফাংশন যোগ করি তবে অবজেক্টটি কোনও বৃহত্তর হিসাবে দেখায় না
ডন রোমি

কী গণনা করছে না
ebg11

7

আমি জানতে চাই যে আমার স্মৃতি হ্রাস করার প্রচেষ্টা আসলে মেমরি হ্রাস করতে সহায়তা করে

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

এখন দুটি বিকল্প রয়েছে: বিকল্প 1 - আপনি মেমরির সমস্যা তৈরি করতে সফল হন নি। অতএব, আপনি কিছুই জন্য উদ্বেগ করছেন। আপনার কোনও স্মৃতি সমস্যা নেই এবং আপনার প্রোগ্রামটি ভাল is

বিকল্প 2- আপনি একটি স্মৃতি সমস্যা পেয়েছেন। এখন নিজেকে জিজ্ঞাসা করুন যে সমস্যাটি সীমাবদ্ধ হয়েছে সেখানে যুক্তিটি যুক্তিসঙ্গত কিনা (অন্য কথায়: সম্ভবত আপনার কোডের সাধারণ ব্যবহারে এই পরিমাণ অবজেক্ট তৈরি হবে)। উত্তরটি যদি 'না' হয় তবে আপনি ভাল আছেন। অন্যথায় আপনি এখন জানেন যে আপনার কোডটি কতগুলি অবজেক্ট তৈরি করতে পারে। অ্যালগরিদমটি পুনরায় কাজ করুন যাতে এটি এই সীমাটিকে লঙ্ঘন করে না।


মেমরি স্ট্যান্ড পয়েন্ট থেকে, আমার এক্সটেনশন ফায়ারফক্সে খোলা প্রতিটি পৃষ্ঠা / ট্যাবের জন্য বেশ কয়েকটি অবজেক্ট যুক্ত করে। "সংখ্যা" পৃষ্ঠার আকারের সাথে সমানুপাতিক। ধরে নিই যে "শক্তি" ব্যবহারকারীদের মধ্যে 15 - 20 টি ট্যাব খোলা রয়েছে এবং ওয়েব পৃষ্ঠায় প্রচুর বিষয়বস্তু থাকলে ব্রাউজারটি কিছু সময়ের পরে ধীর এবং হতাশার সাথে অ-প্রতিক্রিয়াশীল হয়ে ওঠে। এমনকি আমি স্পষ্টভাবে অ্যাপটিতে চাপ দেওয়ার চেষ্টা না করেই এটি ঘটে। আমার কোডটি পুনরায় লেখার পরিকল্পনা রয়েছে যা আমি মনে করি যা প্রচুর অবজেক্ট তৈরি হ্রাস করবে। আমি ঠিক নিশ্চিত হতে চেয়েছিলাম যে না। বেনিফিট অবজেক্টস এমন কিছু পরিমাণে যাতে এটি মূল্যবান হয়

@ সেন্থিল: তবে উপলব্ধ মেমরির পরিমাণ না জেনে অবজেক্টের আকারের কোনও অর্থ নেই। যেহেতু মেমরির পরিমাণ একটি রহস্য থাকা, #objects পরিপ্রেক্ষিতে ভাষী সম্ভবত #bytes মেয়াদে ভাষী যেমন ঠিক যেমন দরকারী
Itay মামান

5

যদি আপনার প্রধান উদ্বেগটি আপনার ফায়ারফক্স এক্সটেনশনের মেমরি ব্যবহার হয় তবে আমি মজিলা বিকাশকারীদের সাথে পরীক্ষা করার পরামর্শ দিচ্ছি।

মজিলা তার উইকিতে মেমরি ফাঁস বিশ্লেষণ করার জন্য সরঞ্জামগুলির একটি তালিকা সরবরাহ করে ।


5

এই জাভাস্ক্রিপ্ট লাইব্রেরি sizeof.jsএকই কাজ করে। এটি এর মতো অন্তর্ভুক্ত করুন

<script type="text/javascript" src="sizeof.js"></script>

আকারের ফাংশনটি কোনও প্যারামিটার হিসাবে নেয় এবং তার আনুমানিক আকারটি বাইটে দেয়। উদাহরণ স্বরূপ:

// define an object
var object =
    {
      'boolean' : true,
      'number'  : 1,
      'string'  : 'a',
      'array'   : [1, 2, 3]
    };

// determine the size of the object
var size = sizeof(object);

আকারের ফাংশনটি এমন অবজেক্টগুলিকে পরিচালনা করতে পারে যা অন্যান্য অবজেক্ট এবং পুনরাবৃত্ত তথ্যগুলির একাধিক উল্লেখ রয়েছে re

মূলত এখানে প্রকাশিত


এটি আমার ধরণের ক্ষেত্রে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে।
ক্রিগক্স


2

এর জন্য কোডে কাজ করা প্রত্যেককে অনেক ধন্যবাদ!

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

যাইহোক, আমি এটি এমন কিছুর জন্য ব্যবহার করি:

var myCache = {
    cache: {},
    order: [],
    size: 0,
    maxSize: 2 * 1024 * 1024, // 2mb

    add: function(key, object) {
        // Otherwise add new object
        var size = this.getObjectSize(object);
        if (size > this.maxSize) return; // Can't store this object

        var total = this.size + size;

        // Check for existing entry, as replacing it will free up space
        if (typeof(this.cache[key]) !== 'undefined') {
            for (var i = 0; i < this.order.length; ++i) {
                var entry = this.order[i];
                if (entry.key === key) {
                    total -= entry.size;
                    this.order.splice(i, 1);
                    break;
                }
            }
        }

        while (total > this.maxSize) {
            var entry = this.order.shift();
            delete this.cache[entry.key];
            total -= entry.size;
        }

        this.cache[key] = object;
        this.order.push({ size: size, key: key });
        this.size = total;
    },

    get: function(key) {
        var value = this.cache[key];
        if (typeof(value) !== 'undefined') { // Return this key for longer
            for (var i = 0; i < this.order.length; ++i) {
                var entry = this.order[i];
                if (entry.key === key) {
                    this.order.splice(i, 1);
                    this.order.push(entry);
                    break;
                }
            }
        }
        return value;
    },

    getObjectSize: function(object) {
        // Code from above estimating functions
    },
};

এটি একটি সরল উদাহরণ এবং এর কিছু ত্রুটি থাকতে পারে তবে এটি ধারণা দেয়, কারণ আপনি কিছুটা বুদ্ধি দিয়ে স্ট্যাটিক অবজেক্টগুলিকে (বিষয়বস্তু পরিবর্তন করতে পারবেন না) ধরে রাখতে পারেন। এটি কোনও ব্যয়বহুল প্রক্রিয়াজাতকরণের প্রয়োজনীয়তাগুলিকে উল্লেখযোগ্যভাবে হ্রাস করতে পারে যা অবজেক্টটি প্রথম স্থানে তৈরি করতে হয়েছিল।


1
function sizeOf(parent_data, size)
{
    for (var prop in parent_data)
    {
        let value = parent_data[prop];

        if (typeof value === 'boolean')
        {
            size += 4;
        }
        else if (typeof value === 'string')
        {
            size += value.length * 2;
        }
        else if (typeof value === 'number')
        {
             size += 8;
        }
        else
        {      
            let oldSize = size;
            size += sizeOf(value, oldSize) - oldSize;
        }
    }

    return size;
}


function roughSizeOfObject(object)
{   
    let size = 0;
    for each (let prop in object)
    {    
        size += sizeOf(prop, 0);
    } // for..
    return size;
}

1

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

<html>
<script>
var size = 1000*100
window.onload = function() {
  document.getElementById("quantifier").value = size
}

function scaffold()
{
  console.log("processing Scaffold...");
  a = new Array
}

function start()
{
  size = document.getElementById("quantifier").value
  console.log("Starting... quantifier is " + size);
  console.log("starting test")
  for (i=0; i<size; i++){
    a[i]={"some" : "thing"}
  }
  console.log("done...")
}

function tearDown()
{
  console.log("processing teardown");
  a.length=0
}

</script>
<body>
    <span style="color:green;">Quantifier:</span>
    <input id="quantifier" style="color:green;" type="text"></input>
    <button onclick="scaffold()">Scaffold</button>
    <button onclick="start()">Start</button>
    <button onclick="tearDown()">Clean</button>
    <br/>
</body>
</html>

প্রতিটিতে মাত্র একটি মিলিয়ন মিলিয়ন অবজেক্ট ইনস্ট্যান্ট করা (উপরের এই কোড হিসাবে) এখনই আমার ক্রোমিয়ামে প্রতি বস্তুতে 50 বাইটের মোটামুটি গণনা করে। কোডটি পরিবর্তন করে প্রতিটি বস্তুতে এলোমেলো স্ট্রিং তৈরি করতে প্রতিটি বস্তুতে প্রায় 30 টি বাইট যোগ করা হয়। আশা করি এটি সাহায্য করবে।


1

আপনার যদি প্রোগ্রমেটিকভাবে এপ্রক্সের জন্য পরীক্ষা করতে হয়। অবজেক্টের আকার আপনি এই লাইব্রেরিটিও চেক করতে পারেন http://code.stephenmorley.org/javascript/finding-tm-mmory-usage-of-objects/ যে আমি বস্তুর আকারের জন্য ব্যবহার করতে সক্ষম হয়েছি।

অন্যথায় আমি Chrome / ফায়ারফক্স হ্যাপ প্রোফাইলার ব্যবহার করার পরামর্শ দিই।


-3

আমি বিশ্বাস করি আপনি 'অ্যারে' অন্তর্ভুক্ত করতে ভুলে গেছেন।

  typeOf : function(value) {
        var s = typeof value;
        if (s === 'object')
        {
            if (value)
            {
                if (typeof value.length === 'number' && !(value.propertyIsEnumerable('length')) && typeof value.splice === 'function')
                {
                    s = 'array';
                }
            }
            else
            {
                s = 'null';
            }
        }
        return s;
    },

   estimateSizeOfObject: function(value, level)
    {
        if(undefined === level)
            level = 0;

        var bytes = 0;

        if ('boolean' === typeOf(value))
            bytes = 4;
        else if ('string' === typeOf(value))
            bytes = value.length * 2;
        else if ('number' === typeOf(value))
            bytes = 8;
        else if ('object' === typeOf(value) || 'array' === typeOf(value))
        {
            for(var i in value)
            {
                bytes += i.length * 2;
                bytes+= 8; // an assumed existence overhead
                bytes+= estimateSizeOfObject(value[i], 1)
            }
        }
        return bytes;
    },

   formatByteSize : function(bytes)
    {
        if (bytes < 1024)
            return bytes + " bytes";
        else
        {
            var floatNum = bytes/1024;
            return floatNum.toFixed(2) + " kb";
        }
    },

1
জেএস-এ, একটি অ্যারে একটি বস্তু। বাস্তবায়নে কিছু অপ্টিমাইজেশন হতে পারে, তবে ধারণাগতভাবে অ্যারে এবং অবজেক্টগুলি একই।
ক্রিস ওয়াকার

-8

আমি জানি এটি করা একেবারেই সঠিক উপায় নয়, তবুও এটি অতীতে কয়েকবার প্রায় অবজেক্ট ফাইলের আকার পেতে সহায়তা করেছে:

কনসোল বা একটি নতুন ট্যাবে আপনার অবজেক্ট / প্রতিক্রিয়া লিখুন, ফলাফলগুলি একটি নতুন নোটপ্যাড ফাইলে অনুলিপি করুন, এটি সংরক্ষণ করুন এবং ফাইলের আকার পরীক্ষা করুন। নোটপ্যাড ফাইলটি নিজেই মাত্র কয়েক বাইট, সুতরাং আপনি মোটামুটি সঠিক অবজেক্ট ফাইলের আকার পাবেন।


4
এটি সম্পূর্ণ ভুল। উদাহরণস্বরূপ 1/3 = 0.3333333333333333 নম্বর বিবেচনা করুন। এটি আপনার পদ্ধতির ব্যবহার করে 18 বাইট হবে।
কোরসিজেস

2
আমি বললাম এটি আনুমানিক । কখনও কখনও আপনি এটি 1 এমবি বা 1.00001 এমবি কিনা যত্ন নেন না, আপনি কেবল একটি প্রাক্কলন জানতে চান, তবে এই পদ্ধতিটি পুরোপুরি ঠিক আছে।
জেফ্রি রুজেন্ডাল

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