2016-08-03 4 views
3

メモリが重い5000個の単純なJSONオブジェクト(各オブジェクトはidname)の配列を格納することをお勧めしますか?私はそれらを使用した後にそれらを削除する必要があります、メモリ内のいくつかのスペースをクリアするには?5000個のJSONオブジェクトのメモリが重いですか?

+4

5000個のオブジェクトのJSONを取り出し、お気に入りのエディタに貼り付けて保存し、結果のファイルサイズを確認します。 – Marty

+1

これには「すべてに合ったもの」を提供するのはおそらく妥当ではありませんが、このようなツールはhttps://developers.google.com/web/tools/chrome-devtools/profile/memory-problems/memoryに役立ちます-diagnosis?hl = en –

+0

も、使用しているデバイスによって異なります。ブラウザ/ mob? – naveen

答えて

2

はそのJSON文字列を想定したり、ブラウザに格納されていること - のlocalStorage /のsessionStorageを(使用してJSON.stringify)ここでは、文字列サイズ

var items = []; 
 
for (i = 1000000; i < 1005000; i++) { 
 
    items.push({ 
 
    id: i, 
 
    name: "Sooooooooooooome Biiiiiiiggggggggg naaaaaaaaaame_" + i 
 
    }); 
 
} 
 
var json = JSON.stringify(items); 
 
var jsonSize = byteCount(json); 
 

 
console.log("Size:", jsonSize, "KB"); 
 

 
function byteCount(s) { 
 
    return (encodeURI(s).split(/%..|./).length - 1)/1024; 
 
}

の計算上の小さな例です

これは400KBを超えないものとします。あなたは本当に進む方法を決定する必要があります。これは、デバイス、インターネット速度、データの使用頻度などの多くの要素に依存します。

1

オブジェクトのサイズを計算し、自分自身がシステム内に重いかどうかを判断する関数を使用できます。あなたが繰り返しオブジェクトを持ってしようとしている場合は、たとえばjavascript flyweight patternに見てみることができます。

var obj = { 
 
    name: "john", 
 
    surname: "doe" 
 
}; 
 

 
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)); 
 
}; 
 

 
console.log(memorySizeOf(obj));

+1

そこには迷惑な再帰呼び出しがあり、その結果はサイズに追加することを意図しています。 –

+0

再帰呼び出しは、オブジェクトに別のオブジェクトまたはオブジェクトの配列が含まれている場合です。 –

+2

はい、ただしその結果は使用しません。呼び出し元のサイズに追加する必要があります。 –

関連する問題