আমি এই ফাংশনটিতে বাইনারি পরীক্ষা কনডেন্স করেছি যা আমি ব্যবহার করি:
function getStorageTotalSize(upperLimit/*in bytes*/) {
var store = localStorage, testkey = "$_test"; // (NOTE: Test key is part of the storage!!! It should also be an even number of characters)
var test = function (_size) { try { store.removeItem(testkey); store.setItem(testkey, new Array(_size + 1).join('0')); } catch (_ex) { return false; } return true; }
var backup = {};
for (var i = 0, n = store.length; i < n; ++i) backup[store.key(i)] = store.getItem(store.key(i));
store.clear(); // (you could iterate over the items and backup first then restore later)
var low = 0, high = 1, _upperLimit = (upperLimit || 1024 * 1024 * 1024) / 2, upperTest = true;
while ((upperTest = test(high)) && high < _upperLimit) { low = high; high *= 2; }
if (!upperTest) {
var half = ~~((high - low + 1) / 2); // (~~ is a faster Math.floor())
high -= half;
while (half > 0) high += (half = ~~(half / 2)) * (test(high) ? 1 : -1);
high = testkey.length + high;
}
if (high > _upperLimit) high = _upperLimit;
store.removeItem(testkey);
for (var p in backup) store.setItem(p, backup[p]);
return high * 2; // (*2 because of Unicode storage)
}
এটি পরীক্ষার আগে সামগ্রীগুলিকে ব্যাক আপ করে, তারপরে সেগুলি পুনরুদ্ধার করে।
এটি কীভাবে কাজ করে: সীমা না পৌঁছানো বা পরীক্ষা ব্যর্থ হওয়া পর্যন্ত এটি আকার দ্বিগুণ করে। এরপরে এটি নিম্ন এবং উচ্চের মধ্যে অর্ধেক দূরত্ব সঞ্চয় করে এবং প্রতিবারের অর্ধেক যোগ করে (ব্যর্থতার বিয়োগ করে সাফল্য যোগ করে); যথাযথ মান মধ্যে সম্মান।
upperLimitডিফল্ট হিসাবে 1 গিগাবাইট, এবং বাইনারি অনুসন্ধান শুরু করার আগে তাত্পর্যপূর্ণভাবে স্ক্যান করতে কতদূর উপরে সীমাবদ্ধ। আমি সন্দেহ করি এটি এমনকি পরিবর্তন করা প্রয়োজন, কিন্তু আমি সবসময় সামনে চিন্তা করি। ;)
Chrome এ:
> getStorageTotalSize();
> 10485762
> 10485762/2
> 5242881
> localStorage.setItem("a", new Array(5242880).join("0")) // works
> localStorage.setItem("a", new Array(5242881).join("0")) // fails ('a' takes one spot [2 bytes])
আইই ১১, এজ এবং ফায়ারফক্সও একই সর্বোচ্চ আকারের (10485762 বাইট) প্রতিবেদন করে report