Ale*_*ara 8 javascript firefox gecko web-storage indexeddb
我想使用IndexedDB处理大量数据.太多的数据要适合内存.为此,我想使用Firefox的IndexedDB持久存储,它允许我存储超过2GB的数据(Firefox显然对非持久存储有2GB的限制).
但是,我遇到了一个问题.Firefox似乎没有对我可以存储在持久存储中的数据量施加限制.事实上,如果我让以下示例运行,它将显然运行直到磁盘已满!
示例(在线)(必须在Firefox中运行!):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Firefox IndexedDB Limit Test</title>
</head>
<body>
<script>
(function() {
'use strict';
var IDBReq = indexedDB.open('testdb', {
version: 1,
storage: 'persistent'
});
IDBReq.onupgradeneeded = function() {
this.result.createObjectStore('data');
};
var logmsg;
IDBReq.onsuccess = function() {
var DB = this.result;
var size = 0;
var next = function(i) {
var data = new Uint8Array(0xFFFF);
crypto.getRandomValues(data);
size += data.length;
logmsg = 'size: ' + size + 'b ' + (size / (1024 * 1024 * 1024)) + 'gb';
var store = DB.transaction(['data'], 'readwrite').objectStore('data');
var storeReq = store.add(data, 'data-' + i);
storeReq.onsuccess = function() {
next(i + 1);
};
storeReq.onerror = function() {
console.log('storeReq error');
console.log(this.error);
};
};
next(1);
};
setInterval(function() {
if (logmsg) {
console.log(logmsg);
logmsg = null;
}
}, 1000);
})();
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
出于显而易见的原因,填写用户的驱动器并不理想.如果用户没有足够的可用磁盘空间,最好不要尝试运行它,或者至少在超过X%满时停止.
奇怪的是,根据MDN,似乎浏览器应该对存储的数据量施加限制:
最大的浏览器存储空间是动态的 - 它取决于您的硬盘大小.全局限制计算为可用磁盘空间的50%.在Firefox中,名为Quota Manager的内部浏览器工具会跟踪每个源使用的磁盘空间,并在必要时删除数据.
因此,如果您的硬盘为500GB,那么浏览器的总存储空间为250GB.如果超出此范围,则会发起称为原始驱逐的过程,删除整个原始数据的数据,直到存储量再次低于限制.没有修剪效果,删除部分原点 - 删除原产地的一个数据库可能会导致不一致的问题.
还有另一个限制称为组限制 - 这被定义为全局限制的20%.每个起源都是一组(起源组)的一部分.每个eTLD + 1域都有一个组.
但是,我的测试在填满驱动器时从未丢失任何错误.
现在我的问题是,有没有办法确保将大量数据放入Firefox的IndexedDB持久存储中不会填满用户的驱动器,让他们非常非常生气?
请注意 MDN 文章中的一行:
临时数据存储不会引起任何用户提示,但有存储限制。
它可能更清楚,但这意味着存储限制仅适用于临时存储。因此,全局限制和组限制对于持久存储无效。
您可以考虑切换到临时存储。但如果你需要持久性,那么在 Firefox 实现navigator.storageQuota或navigator.storageManager之前你可能会运气不好,以选定的为准。
| 归档时间: |
|
| 查看次数: |
629 次 |
| 最近记录: |