我正在滚动一个包含大量记录的大型文本文件,每条记录在文件中占用多行。这一切都很好。但是,为了提高性能,我想要某种预读缓存(向上滚动时也可以使用)。
基本上它应该在当前记录之前和之后自动缓存一定数量,但不是每个滚动操作都应该触发缓存更改。这意味着只有在达到某个限制后,才会移动缓存。
我有点纠结于如何管理这样的缓存,例如,何时触发预读。我可以将 ehcache 与 LRU 一起使用。LRU 应该自动驱逐正确的整体。然后问题仍然是如何管理何时驱逐。
寻找一般的想法,语言是Java。
循环缓冲区怎么样?
暂时忽略圆形部分(它画得不太好)......
出发:
---------- entire buffered contents ---------
| ---- no reload threshold ---- |
| | current display | |
| | | | | |
只要在current display
内no reload threshold
,什么都不做,但是一旦我们达到不重新加载阈值:
---------- entire buffered contents ---------
| ---- no reload threshold ---- |
| current display | |
| || | | |
丢弃右边的东西,在左边加载更多的东西,然后改变不重新加载阈值,这样我们就有了一张和第一张一模一样的图片。
好吧,实际上您可能不必立即丢弃右侧的东西,明智的做法是保留它直到它向左移动更多,以防万一用户移回右侧(然后您已经有加载的数据),但是,在这种情况下,你可能有一个更大的缓冲区,所以也许只是丢弃它。
这里的“左”和“右”是“下”和“上”,或“上”和“下”。
您必须使用缓冲区大小和阈值。
一边大声思考……
假设您计算已读取的字节数以及当前可见的字节数。
那就是在光标/视图之前和之后有两个缓冲区。当您向下滚动时,buffer_after 光标会减少您在屏幕上显示的字节数。
当 buffer_after 的大小达到某个低值时,您会触发预读并填充缓冲区。