mirror of
https://github.com/protomaps/PMTiles.git
synced 2026-02-04 10:51:07 +00:00
implement LRU cache
This commit is contained in:
@@ -57,7 +57,7 @@
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
// TODO make this LRU
|
this.step = 0
|
||||||
this.leaves = new Map()
|
this.leaves = new Map()
|
||||||
this.outstanding_requests = new Map()
|
this.outstanding_requests = new Map()
|
||||||
}
|
}
|
||||||
@@ -65,7 +65,8 @@
|
|||||||
getLeaf = (offset, len) => {
|
getLeaf = (offset, len) => {
|
||||||
return new Promise((resolve,reject) => {
|
return new Promise((resolve,reject) => {
|
||||||
if (this.leaves.has(offset)) {
|
if (this.leaves.has(offset)) {
|
||||||
resolve(this.leaves.get(offset))
|
this.leaves.get(offset)[0]++
|
||||||
|
resolve(this.leaves.get(offset)[1])
|
||||||
} else if (this.outstanding_requests.has(offset)) {
|
} else if (this.outstanding_requests.has(offset)) {
|
||||||
this.outstanding_requests.get(offset).push(resolve)
|
this.outstanding_requests.get(offset).push(resolve)
|
||||||
} else {
|
} else {
|
||||||
@@ -74,12 +75,22 @@
|
|||||||
return resp.arrayBuffer()
|
return resp.arrayBuffer()
|
||||||
}).then(buf => {
|
}).then(buf => {
|
||||||
var map = bytesToMap(new DataView(buf),len/17)
|
var map = bytesToMap(new DataView(buf),len/17)
|
||||||
this.leaves.set(offset,map)
|
if (this.leaves.size > 32) {
|
||||||
resolve(map)
|
var minStep = Infinity
|
||||||
this.outstanding_requests.get(offset).forEach(f => {
|
var minKey = undefined
|
||||||
f(map)
|
this.leaves.forEach((val,key) => {
|
||||||
|
if (val[0] < minStep) {
|
||||||
|
minStep = val[0]
|
||||||
|
minKey = key
|
||||||
|
}
|
||||||
})
|
})
|
||||||
console.log("leaves: ", this.leaves.size)
|
this.leaves.delete(minKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.leaves.set(offset,[this.step++,map])
|
||||||
|
resolve(map)
|
||||||
|
this.outstanding_requests.get(offset).forEach(f => f(map))
|
||||||
|
this.outstanding_requests.delete(offset)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user