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