我想使用IndexedDB处理 很多 的数据。太多的数据要适合内存。为此,我想使用Firefox的IndexedDB持久存储,它允许我存储超过2GB的数据(Firefox apparently has a limit of 2GB imposed on non-persistent storage)。
但是,我遇到了一个问题。 Firefox似乎没有对我可以存储在持久存储中的数据量施加限制。事实上,如果我让以下示例继续运行,它将显然运行直到磁盘已满!
示例(Online)(必须在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>
出于显而易见的原因,填写用户的驱动器并不理想。如果用户没有足够的可用磁盘空间,最好不要尝试运行它,或者至少在超过X%时停止。
奇怪的是,according to MDN,浏览器似乎应对存储的数据量施加限制:
最大浏览器存储空间是动态的 - 它取决于您的硬盘大小。全局限制计算为可用磁盘空间的50%。在Firefox中,一个名为Quota Manager的内部浏览器工具会跟踪每个源用尽的磁盘空间,并在必要时删除数据。
因此,如果您的硬盘为500GB,那么浏览器的总存储空间为250GB。如果超出此范围,则会发起称为原始驱逐的过程,删除整个原始数据的数据,直到存储量再次低于限制。没有修剪效果,删除部分原点 - 删除原始数据库可能会导致不一致的问题。
还有一个名为组限制的限制 - 这被定义为全局限制的20%。每个起源都是一组(起源组)的一部分。每个eTLD + 1域都有一个组。
然而,我的测试在填满驱动器时从未丢失任何错误。
现在我的问题是,有没有办法确保将大量数据放入Firefox的IndexedDB持久存储中不会填满用户的驱动器,让他们非常非常生气?
答案 0 :(得分:3)
请注意MDN文章中的一行:
临时数据存储不会引出任何用户提示,但存在存储限制。
它可能更清晰,但这意味着存储限制仅适用于临时存储。因此,全局限制和组限制对持久存储无效。
您可以考虑切换到临时存储空间。但是,如果你需要持久性,那么在Firefox实施navigator.storageQuota或navigator.storageManager之前,你可能会失去运气,无论哪个已经确定。