超过localStorage配额(localStorage size!=文件下载大小)&如何检查localStorage大小

时间:2011-04-28 05:35:02

标签: javascript caching local-storage

我想不出一个好的头衔,所以希望这样做。

我正在做的是创建离线HTML5网络应用程序。 “出于某些原因”我不希望将某些文件放在缓存清单中,而是将内容放在localStorage中。

所有测试均在Google Chrome for Mac / Mac OS 10.6.6

中完成

我有4个JSON文件,总大小正好3,120,792个字节。首次访问(在线)应用程序时,我将下拉此JSON内容并将其放在一个字符串变量中,例如str。在存储JSON字符串之前,我正在剥离所有\n\t,并将\"替换为',以最小化字符串长度。

以下是字符串长度(Chrome控制台中的str.length):

original str : 3,117,764 (this is a concatenation of the contents of the 4 JSON files)
reformatted JSON: 2,732,249 (not too shabby - should save me a few bytes)

但是,现在当我尝试将此字符串存储在localStorage中时,我收到的错误是我已超出缓存大小(Error: QUOTA_EXCEEDED_ERR: DOM Exception 22)。但是此页面没有缓存其他内容(我已手动删除了所有Google Chrome缓存文件)。

为什么会这样?

存储在缓存中时字符串的大小是多少?

如何最大限度地减小此大小以充分利用localStorage?

编辑添加: 我已经尝试将字符串的1,000,000个字符保存到localStorage(localStorage.setItem('x',str.substr(1,1000000))。当我在Chrome的缓存文件夹中检查localStorage文件大小时,它是2MB。这是一个sqlite数据库。看起来浏览器使用的是实际的localStorage数据库大小,而不是存储在其中的数据大小。这当然很糟糕,但可能是标准行为。我想你可以在localStorage中存储的最长的字符串大约是2,500,000个字符?

3 个答案:

答案 0 :(得分:7)

知道在本地存储中可以存储多少个字符的好方法是通过以下链接对其进行测试:http://arty.name/localstorage.html

大小取决于浏览器HTML5实现

我的最后一次测试: Chrome 13 / Safari 5 / IPAD 2:2.600.000 chr FIREFOX 4:5.200.000 OPERA 11:无限制

答案 1 :(得分:4)

http://jsfiddle.net/brucealdridge/j6KdJ/ 我的2,500,000个字符(“5.0(X11; Linux i686)AppleWebKit / 534.30(KHTML,像Gecko)Ubuntu / 10.10 Chromium / 12.0.742.9 Chrome / 12.0.742.9 Safari / 534.30”) 3,000,000没有。我以为它可能是一个编码的东西,但我刚刚检查过,而不是

答案 2 :(得分:-1)

奇怪的是,接受说明最大金额的答案。您是否应该验证所有localStorage键/值对的当前大小减去浏览器实现的最大限制?

这是一个jsfiddle来说明这种用法。对于那些想要简单回答的人,请使用以下js ...

 function _calc() { return 1024 * 1024 * 5 - unescape(encodeURIComponent(JSON.stringify(localStorage))).length; }

更新:此snippit更准确。

function _calc(s){var c,e=s||window.localStorage;for(var k in e){if(e.hasOwnProperty(k)){c+=e[k];}}return c?3+((c.length*16)/(8*1024)):0;}