在工作中,我正在处理这样一种情况,即我们有大量的时间序列数据,并且需要一次向用户显示其中的部分。数据实际上有无限多的记录,因此客户端不可能一次加载整个数据集。但是,请求数据部分的API调用是缓慢/昂贵的,因此我希望缓存已经加载的数据客户端,而不必重新请求它。
比方说,当你在网上观看一段视频,前后跳过时。播放机根据用户当前试图观看的内容下载视频片段,并将其存储起来,以防用户再次观看该片段。
不过,在我的用例和视频示例之间有一些不同:
我在编程方面是自学的,我不知道这个概念的名字,但我觉得一定有一个。我有能力实现我需要自己的东西,但我希望避免重新发明轮子。
发布于 2018-01-10 23:52:46
如果不是因为缺少离散的部分,我会认为这是一种页面缓存/替换算法。仅仅因为用户选择任意范围并不一定意味着您仍然无法检索包含该范围的一组页面,对吗?数据集中的行是否有一个自动递增的id?如果是这样,那么您可以轻松地将数据划分为由固定数量的记录组成的页面。为了检索包含数据的页面,您可以简单地使用模块化算法,即查找id,然后查找do (id mod n),其中n是页大小,以获得包含页面的第一条记录;对于范围末尾的页面,可以使用do (id mod n) +n。如果您的数据没有此功能,那么您可能会从历史上生成数字,并从现在开始自动生成它们?
https://en.wikipedia.org/wiki/Page_替换_算法
Id还考虑使用某种库。不确定您的语言,但快速搜索显示了这个有趣的项目,您可以参考:
发布于 2018-01-11 07:40:33
不确定这是否是您已经考虑的内容:但是考虑到您的用例,您可能会从一个非常简单的缓存算法中获得很多好处,通过这个算法,您可以在缓存中维护一个单变量长度段。当您超出了左或右的界限时,只需将段增长到所需的数量(最好是所需数量的几倍,以避免进一步的查询)。同样,如果放大,则扩展段的两端。放大,显然不需要改变段。您可能需要限制段的最大大小,在这一点上,如果您向左移动,则会从右侧丢失相应的部分,反之亦然。移动到一个完全不同的段应该保留与旧段交集的数据,并丢弃新段之外的数据。对于这个实现,您可能需要一个高效实现的双结束列表(https://github.com/petkaantonov/deque)。
这不能很好地工作的一个用例是,当用户在两个不相交的段之间切换时,这两个段的大小超过了最大段的大小,或者如果他们跳过几个远程数据区域。
不幸的是,我不知道这样的算法.
要记住的另一个想法是100%确定瓶颈在哪里。您是否确信优化不佳的不是datatable或查询(例如索引)。可能是数据库资源不足,或者是编组大量数据的速度,或者是将数据加载到javascript对象的方式效率低下,或者是网络往返的延迟等。
https://softwareengineering.stackexchange.com/questions/363788
复制相似问题