Javascript IndexedDB存储250kB/s流式数据的性能问题
我正在为硬件传感器开发一个基于web的接口,该接口可产生约250kB/s的原始数据(125 kS/s,每个样本16位)。web应用程序旨在实时可视化(使用画布)和存储(使用IndexedDB)这些数据。我的indexedDB存储存在性能问题 此应用程序设计为运行数天甚至数周,并应可靠地存储大量数据(数十到数百MB) 因为写提交似乎是一般的性能问题,所以我重写了我的应用程序,每5秒只存储一大块数据作为非稀疏整数数组对象。这种方法很有效,但我仍然获得了非常不稳定的可视化性能,高CPU和高内存使用率。确切的存储代码:Javascript IndexedDB存储250kB/s流式数据的性能问题,javascript,indexeddb,Javascript,Indexeddb,我正在为硬件传感器开发一个基于web的接口,该接口可产生约250kB/s的原始数据(125 kS/s,每个样本16位)。web应用程序旨在实时可视化(使用画布)和存储(使用IndexedDB)这些数据。我的indexedDB存储存在性能问题 此应用程序设计为运行数天甚至数周,并应可靠地存储大量数据(数十到数百MB) 因为写提交似乎是一般的性能问题,所以我重写了我的应用程序,每5秒只存储一大块数据作为非稀疏整数数组对象。这种方法很有效,但我仍然获得了非常不稳定的可视化性能,高CPU和高内存使用率。
//dataDB = indexedDB database opened in another function
//slice = data to be stored
//sessionID = object store index
//this function is called about once every 5 seconds
//with 700 000 values in the slice array
//slice is a multidimensional array
function storeFastData(slice, sessionID){
var s = dataDB.transaction(["fastData"],"readwrite").objectStore("fastData");
var fdreq = s.get(sessionID);
fdreq.onsuccess = function(e){
var d = fdreq.result;
for(i = 0; i < slice.length; i++){
d.data[i][1] = slice[i][1];
}
s.put(d);
}
}
//dataDB=indexedDB数据库在另一个函数中打开
//slice=要存储的数据
//sessionID=对象存储索引
//此函数大约每5秒调用一次
//切片数组中有700000个值
//slice是一个多维数组
函数storeFastData(切片、会话ID){
var s=dataDB.transaction([“fastData”],“readwrite”).objectStore(“fastData”);
var fdreq=s.get(sessionID);
fdreq.onsuccess=函数(e){
var d=fdreq.result;
对于(i=0;i
具体地说:
- IndexedDB是否是此应用程序的正确选择
- 我实施这一点的方式是不是一个白痴?这是我正在做的第一个基于IndexedDB的项目
- 我已经读到,使用WebWorkers至少可以解决口吃问题,因为它可以在另一个线程上运行。这能解决我的性能问题吗李>
我不使用jquery。这不能作为本机应用程序编写(它必须在浏览器中运行)。IndexedDB是您的最佳选择。如果您在数据快速且频繁可用时立即进行存储,则应该可以。您不需要等待5秒,请立即以大约200毫秒的间隔存储。通常,indexeddb写操作需要20毫秒你愿意考虑写一个Chrome插件吗?它自然会提供一个后台页面来卸载一些处理,因此不需要网络工作者,并且如果使用无限权限,它可以避免任何配额限制。不,chrome插件将无法实现基于网络的目的。Chrome不是唯一的浏览器,而且可能在5年内不再存在(或者至少,如果趋势继续发展下去,它将被其他浏览器所取代)。记录在案(1.5年后):你可以在Chrome中使用文件系统API,并且只在Chrome中使用,并且它不再被开发,因此不会出现在其他浏览器中(以那种形式)。除此之外,IndexedDB似乎确实是唯一的选择,而且不可靠,因为如果浏览器决定这样做,存储在其中的所有数据都可能随时消失。因此,真的没有任何其他(或任何)好的解决方案。