0

我正在滚动一个包含大量记录的大型文本文件,每条记录在文件中占用多行。这一切都很好。但是,为了提高性能,我想要某种预读缓存(向上滚动时也可以使用)。

基本上它应该在当前记录之前和之后自动缓存一定数量,但不是每个滚动操作都应该触发缓存更改。这意味着只有在达到某个限制后,才会移动缓存。

我有点纠结于如何管理这样的缓存,例如,何时触发预读。我可以将 ehcache 与 LRU 一起使用。LRU 应该自动驱逐正确的整体。然后问题仍然是如何管理何时驱逐。

寻找一般的想法,语言是Java。

4

2 回答 2

2

循环缓冲区怎么样?

暂时忽略圆形部分(它画得不太好)......

出发:

---------- entire buffered contents ---------
|       ---- no reload threshold ----       |
|       |      current display      |       |
|       |     |               |     |       |

只要在current displayno reload threshold,什么都不做,但是一旦我们达到不重新加载阈值:

---------- entire buffered contents ---------
|       ---- no reload threshold ----       |
|       current display             |       |
|      ||              |            |       |

丢弃右边的东西,在左边加载更多的东西,然后改变不重新加载阈值,这样我们就有了一张和第一张一模一样的图片。

好吧,实际上您可能不必立即丢弃右侧的东西,明智的做法是保留它直到它向左移动更多,以防万一用户移回右侧(然后您已经有加载的数据),但是,在这种情况下,你可能有一个更大的缓冲区,所以也许只是丢弃它。

这里的“左”和“右”是“下”和“上”,或“上”和“下”。

您必须使用缓冲区大小和阈值。

于 2013-09-23T16:39:03.950 回答
0

一边大声思考……

假设您计算已读取的字节数以及当前可见的字节数。

那就是在光标/视图之前和之后有两个缓冲区。当您向下滚动时,buffer_after 光标会减少您在屏幕上显示的字节数。

当 buffer_after 的大小达到某个低值时,您会触发预读并填充缓冲区。

于 2013-09-23T16:38:49.880 回答