你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
输入关键字进行搜索
搜索:
没有找到相关结果
Charele - Cisco4321
赞同来自: zmc
赞同来自:
zmc - ES PAAS、JuiceFS
要回复问题请先登录或注册
ES PAAS、JuiceFS
5 个回复
Charele - Cisco4321
赞同来自: zmc
long numBytes = metaIn.readVLong();
this.fstStore.init(in, numBytes);
它把这个交给fstStore去处理,
有两个子类:OnHeapFSTStore和OffHeapFSTStore
OnHeap就和上面老版本的一样,
OffHeap的做法:看下它的解释
Provides off heap storage of finite state machine (FST),using underlying index input instead of byte store on heap
就是不加载进内存,依赖于index input。
它用的是OffHeap。
所以我的看法,Lucene底层是这么做的,上层的ES是无法改变的。
Charele - Cisco4321
赞同来自:
看了这个贴子,我比较了新旧版本的ES,在加载tip(就是FST所在),没有发现有什么改变。
后来找到了我的理解,不过过于复杂,我的理解也不一定正确,就没有回复。
“FST一定会存到堆外内存”,这种变化是Lucene的改变,不是ES的改变。
先看下旧版本的Lucene的做法:
它的做法是,如果FST小于1G,就直接建个byte[]读进来,
(大于1G的话,是用别的类去读,不过本质上也是byte[]的形式)
所以说是在heap里的
zmc - ES PAAS、JuiceFS
赞同来自:
Charele - Cisco4321
赞同来自:
你是不是认为用mmap,就是堆外。如果设置成其它的格式,比如NIOFS,就是on-heap了?
上面旧版本的Lucene的处理方式,它都是直接把FST读到byte[]里面,它并不管你是mmap还是NIO,
所以说这种方式是完全on-heap的。
而新版本的Lucene的处理方式,是依赖于格式的处理方式,就是不直接全部读进内存。
不管你是mmap还是NIO,都可能用到了缓冲,只是方式不一样。
比如mmap用到了内存映射(memory mapping)技术,而NIO用的其它的方式。
打个比方,比如你的电脑内存是8G,就不能放16G的高清电影了???
如果事先要把电影全部读到内存,肯定要oom。
Charele - Cisco4321
赞同来自:
我们看下ES 6.8.16的代码
static final class HybridDirectory extends NIOFSDirectory {
private final FSDirectory randomAccessDirectory;
...
@Override
public IndexInput openInput(String name, IOContext context) throws IOException {
String extension = FileSwitchDirectory.getExtension(name);
switch(extension) {
case "nvd":
case "dvd":
case "tim":
case "cfs":
ensureOpen();
ensureCanRead(name);
default:
return super.openInput(name, context);
}
}
这里是好像并没有tip文件。你是不是就认为tip就会用父类NIOFSDirectory去读了(也就是on-heap了)?
别忘了,ES用的是复合文件格式(肯定是的,这不能设置),所以有的时候是包括在cfs文件里面的,
可能包括在cfs里面,也可能是独立的tip文件,这种情况又该如何去判断呢?
所以我的观点是,文件格式(mmap或者nio),并不是FST在off-headp或者在on-heap的判断标准