Javascript 如何有效地将大型文件加载到IndexedDB存储中?我的应用程序在超过100000行时崩溃
我有一个特定的web应用程序,它依赖于从客户端的本地文件上载大量数据行。目的是将此数据存储在indexeddb中 数据只有我感兴趣的两列,每列包含不超过25个字符的字符串,但是最多可以有100万行 在阅读了大量的问题和文档后,我创建了一些代码,这些代码似乎可以使用20000行以下的较小数据集创建indexeddb,但在较大的数据集上会中断 我确信这是由于设计不好造成的,因为我不熟悉这种工作方式,或者可能在chrome浏览器中出现某种冻结-因为我没有收到任何错误消息,我可以触发一个警报,显示已达到最后一个for循环,但on.complete从不触发,数据库似乎也不会 函数e-的输入是一个读取文件 我还对for循环中的数据执行了一个操作,但为了简单起见,我删除了这个操作Javascript 如何有效地将大型文件加载到IndexedDB存储中?我的应用程序在超过100000行时崩溃,javascript,indexeddb,large-data,Javascript,Indexeddb,Large Data,我有一个特定的web应用程序,它依赖于从客户端的本地文件上载大量数据行。目的是将此数据存储在indexeddb中 数据只有我感兴趣的两列,每列包含不超过25个字符的字符串,但是最多可以有100万行 在阅读了大量的问题和文档后,我创建了一些代码,这些代码似乎可以使用20000行以下的较小数据集创建indexeddb,但在较大的数据集上会中断 我确信这是由于设计不好造成的,因为我不熟悉这种工作方式,或者可能在chrome浏览器中出现某种冻结-因为我没有收到任何错误消息,我可以触发一个警报,显示已达到
function storeDataEnc (e) {
var lines = e.target.result.split('\n');
var request = self.indexedDB.open('DB', 1);
request.onerror = function(e) {
console.log("there was and error:" +e.target.errorCode);
}
request.onupgradeneeded = function(e){
var db = request.result;
var store = db.createObjectStore("col1", {
keyPath: "col2"} );
};
request.onsuccess = function(e) {
var db = request.result;
var tx = db.transaction("dataTable", "readwrite");
var store = tx.objectStore("dataTable");
db.onerror = function(e){
console.log("ERROR" + e.target.errorCode);
}
for (var i = 0; i < lines.length; ++i) {
var test = lines.length - 1;
if (i == test) {console.log('nearly done')};
function forEachLinenow (match) {
if ( match.charAt( 0 ) != '#' ) {
match = match.trim();
var fields = match.split('\t');
var col1in = fields[0];
var col2in = fields[3];
store.put({ COL1: col1in, COL2: col2in }
}
forEachLinenow(lines[i] + '\n');
}
tx.oncomplete = function() {
db.close();
alert("all data read");
}
}
}
函数storeDataEnc(e){
var lines=e.target.result.split('\n');
var request=self.indexedDB.open('DB',1);
request.onerror=函数(e){
日志(“存在错误:+e.target.errorCode”);
}
request.onupgradeneeded=函数(e){
var db=request.result;
var store=db.createObjectStore(“col1”{
键路径:“col2”});
};
request.onsuccess=函数(e){
var db=request.result;
var tx=db.transaction(“数据表”、“读写”);
var store=tx.objectStore(“数据表”);
db.onerror=函数(e){
console.log(“错误”+e.target.errorCode);
}
对于(变量i=0;i
我猜我不了解浏览器在阻止恶意应用占用太多资源方面存在的一些问题。是否有人使用过这种大小的数据,谁可以在我的过程中发现错误
我的猜测是,我可能需要生成多个事务,我确实尝试过,但似乎没有改变我的问题
我知道这可能很慢,但只要数据成功移植,速度本身并不是最大的问题。您可能会遇到浏览器的数据大小限制 mozilla文档中提到了这些限制 以下是谷歌为流行浏览器提供的indexeddb的更多限制。 这些限制似乎都是基于主机操作系统的可用存储空间。
检查您希望导入的数据的大小和可用存储空间。问题看起来确实达到了数据大小限制。我没有发现这一点,因为我预计indexedDB将分配文档中写入的6%的磁盘空间,但在我的chrome浏览器中,它最多只允许101MB。我不确定是什么原因y浏览器正在强制执行此限制。此外,有趣的是,与文件相比,文件在数据库中占用的存储空间要多得多。这可能是个问题。问题确实在于应用程序达到了大小限制,但没有引发任何类型的错误处理事件。事实证明,这是浏览器c的问题好的,当我使用谷歌浏览器时,我的浏览器默认为“隐姓埋名模式”,预计总可用存储空间的6%事实证明,它对应用程序设置了不同的硬限制。使用Google Chrome中的开发工具inspect options,我可以看到应用程序中每个窗口的数据限制都被设置为101MB,这就是问题所在。因此,如果其他人遇到类似问题,这似乎是一个非常简单的浏览问题r选择和设置。确保你没有通过匿名模式运行indexedDb应用程序。从中得到一点代码味道,当然没有理由你需要将1M记录加载到浏览器数据库中?哈哈,这是一个利基应用程序,从用户角度来看,这对包括我在内的少数用户非常有用。最终我可能会必须保留您可能会推荐的it服务器端,但当一百万条记录只有20MB时,我真的认为大小问题对于小用户群的实际好处来说是相当疏忽的——特别是考虑到一个小视频的可比大小。