当前位置: 首页 > Web前端 > JavaScript

webGL缓解内存压力

时间:2023-03-27 00:46:20 JavaScript

场景问题最近在加载一个大模型。在加载一个文件的时候,它会解析出这个文件包含了多少个网格,线,参数,然后会有一个变量来维护这个关系:constdetailedList={mesh:Array,line:Array,parameter:Array}这个会导致内存吃紧,毕竟直接存放的是几千兆的数据信息。那么还有一种说法,加载完直接渲染文件不就可以了吗?但是这样会导致DC过多,CPU承受不了。IndexDB使用indexDB来充当类似内存的功能。我有选择性地将数据存入indexDB,需要的时候再取回,这样会大大缓解内存压力。indexDB类似于NOSQL,不是像MYSQL那样的二维表结构,取数据的速度非常快。构造一个Store和大多数前端项目一样,我也构造了一个store.enumStoreType{MEMORY,INDEXDB}classStore{/***内存中存储的数据*/privatememory:MapprivatereadonlydbVersion:number;/***indexDB*/私有数据库:IDBDatabase;私人准备就绪:布尔值;/***使用indexDB只存储存储的值,否则使用map*/privatereadonlylimitForDB:number;/***达到存储限制后一次删除多少条数据*/privatereadonlydeleteCount:number;/***存储限制*/privatereadonlyupperStorageLimit:number;constructor(dbVersion=1,limitForDB?:number){this.isReady=false这个。dbVersion=dbVersionthis.initIndexDB()this.memory=newMap()this.limitForDB=limitForDB||30this.upperStorageLimit=10000this.deleteCount=20}set(key:string,value:any,type?:StoreType){constintoMemory=()=>{这个。记忆。设置(键,值)}常量intoIndexDB=()=>{constobjectStore=this.getObjectStore();objectStore.put({id:key,value},key);this.calculationTimesAndDelete();}if(typeoftype!=='undefined'){type===StoreType.INDEXDB?intoIndexDB():intoMemory()}else{if(Store.sizeOf(value)>this.limitForDB){//indexDB添加之前删除map中存在的keythis.clear(key,StoreType.MEMORY)intoIndexDB()}else{//添加映射之前删除indexDB中存在的keythis.clear(key,StoreType.INDEXDB)intoMemory()}}}get(key:string,type?:StoreType):Promise{returnnewPromise((resolve,reject)=>{constfromMemory=(key)=>{resolve(this.memory.get(key))}constfromIndexDB=(key)=>{constobjectStore=this.getOb项目存储区();constindex=objectStore.index("id");constres=index.get(key);res.onsuccess=(e)=>{//@ts-ignoreresolve(e.target.result.value)}res.onerror=(e)=>{reject(e)}}if(typeoftype!=='未定义'){类型===StoreType.INDEXDB?fromIndexDB(key):fromMemory(key)}else{this.memory.has(key)?fromMemory(key):fromIndexDB(key)}})}/***查询数据库条目数*/calculationTimesAndDelete(){constresult=this.getObjectStore().count()result.onsuccess=(e)=>{//@ts-ignoreif(e.result>this.upperStorageLimit){this.deleteFromPrevious()}}}/***达到阈值后删除第一个创建的数据*@description阻止数据膨胀*/deleteFromPrevious(){constobjectStore=this.getObjectStore()constrequest=objectStore.openCursor();letcount=0request.onsuccess=(event)=>{//@ts-ignoreconstcursor=event.target.resultif(cursor){if(count===this.deleteCount)返回;计数++;objectStore.delete(cursor.key)cursor.continue()}}}getObjectStore(){consttransaction=this.db.transaction(["store"],"readwrite");returntransaction.objectStore("store")}clear(key:string,type?:StoreType){constfromMemoryDe??l=()=>this.memory.delete(key)constfromIndexDBDel=()=>{constobjectStore=this.获取对象存储();objectStore.delete(key)}if(typeoftype!=='undefined'){类型===存储类型.INDEXDB?fromIndexDBDel():fromMemoryDe??l()}else{this.memory.has(key)?fromMemoryDe??l():fromIndexDBDel()}}initIndexDB(){//@ts-ignoreconstindexedDB=window.indexedDB||窗口.webkitIndexedDB||窗口.mozIndexedDB||窗口.OIndexedDB||window.msIndexedDBif(!indexedDB){alert('indexDB被浏览器禁止停止!')thrownewError('indexDB在浏览器中被禁止!')}constrequest=indexedDB.open("elephantFiles",this.dbVersion)request.onerror=function(){thrownewError('创建/访问IndexedDB数据库时出错');}request.onsuccess=event=>{//@ts-ignorethis.db=event.target.resultasIDBDatabase;this.isReady=true}request.onupgradeneeded=(event)=>{console.log('databaseupgradeneeded!')//@ts-ignoreconstdb=event.target.result作为IDBDatabase;if(!db.objectStoreNames.contains('store')){conststore=db.createObjectStore('store')store.createIndex('id','id')}}}/***@description不是确认是否在初始化完成时在这里包装查询赋值和其他操作*/ready(callback:Function){conststep=()=>{if(this.isReady){callback&&callback()return;}window.requestAnimationFrame(step)}window.requestAnimationFrame(step)}/***@description估计字节大小,忽略key的长度,如果是对象,只计算值,比JSON.stringify更快*/staticsizeOf(value):number{consttypeSizes={"undefined":()=>0,"boolean":()=>4,"number":()=>8,"string":item=>82*项目。长度,“对象”:项目=>!网站米?0:Object.keys(item).reduce((total,key)=>size(key)+size(item[key])+total,0)};constsize=value=>typeSizes[typeofvalue](value);returnsize(value)}}export{StoreType,Store}使用consta=newStore();a.ready(()=>{a.set('a',{k:'dsdsdsdsdssdsd',p:[123,'sdsdsdsdsdsdsdvvvvvvvvv']})a.set('b',123)a.get('b')a.get('a')})根据客户的客户端情况调整limitForDB和upperStorageLimit

最新推荐
猜你喜欢