检测Firefox IndexedDB或Web存储存储限制,而不填满磁盘?

时间:2017-05-01 20:17:15

标签: javascript firefox indexeddb gecko web-storage

我想使用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持久存储中不会填满用户的驱动器,让他们非常非常生气?

1 个答案:

答案 0 :(得分:3)

请注意MDN文章中的一行:

  

临时数据存储不会引出任何用户提示,但存在存储限制。

它可能更清晰,但这意味着存储限制仅适用于临时存储。因此,全局限制和组限制对持久存储无效。

您可以考虑切换到临时存储空间。但是,如果你需要持久性,那么在Firefox实施navigator.storageQuotanavigator.storageManager之前,你可能会失去运气,无论哪个已经确定。