Fuseki中有一个参数--mem
:
fuseki-server --mem /DatasetPathName
我可以使用它将完整的tdb索引加载到内存中以提高查询性能吗?
例如,
fuseki-server --mem --loc=/tdbpath /DatasetPathName
/ tdbpath是一个带有tdb索引和文件的目录(我使用tdbloader加载我的数据)。
我尝试了一下但发现添加内存不会增加内存的使用量(与fuseki-server --loc = / tdbpath / DatasetPathName相比)。我做错了吗?
由于
答案 0 :(得分:1)
查看FusekiCmd#processModulesAndArgs()
的实现,Fuseki将参数--mem
,--memtdb
和--loc=X
解释为存在单个数据集的互斥规范。在同一组命令行参数中同时提供--mem
和--loc=X
会导致仅使用--loc=X
:
if ( contains(argMem) ) {
log.info("Dataset: in-memory") ;
cmdLineDataset = new ServerInitialConfig() ;
cmdLineDataset.argTemplateFile = Template.templateMemFN ;
}
if ( contains(argFile) ) {
String filename = getValue(argFile) ;
log.info("Dataset: in-memory: load file: " + filename) ;
if ( !FileOps.exists(filename) )
throw new CmdException("File not found: " + filename) ;
// Directly populate the dataset.
cmdLineDataset = new ServerInitialConfig() ;
cmdLineDataset.dsg = DatasetGraphFactory.createMem() ;
// INITIAL DATA.
Lang language = RDFLanguages.filenameToLang(filename) ;
if ( language == null )
throw new CmdException("Can't guess language for file: " + filename) ;
RDFDataMgr.read(cmdLineDataset.dsg, filename) ;
}
if ( contains(argMemTDB) ) {
//log.info("TDB dataset: in-memory") ;
cmdLineDataset = new ServerInitialConfig() ;
cmdLineDataset.argTemplateFile = Template.templateTDBMemFN ;
cmdLineDataset.params.put(Template.DIR, Names.memName) ;
}
if ( contains(argTDB) ) {
cmdLineDataset = new ServerInitialConfig() ;
cmdLineDataset.argTemplateFile = Template.templateTDBDirFN ;
String dir = getValue(argTDB) ;
cmdLineDataset.params.put(Template.DIR, dir) ;
}
如上所示,如果选择了其中一个选项,则后面的选项可以覆盖通过命令行参数提供的数据集。最多可以使用一个。话虽这么说,你可以告诉Fuseski使用--memtdb
选项使用内存中的TDB数据集。根据文档,这应该仅用于测试。
根据@andys,TDB(使用--loc
选项)应该在使用时将值缓存到内存中。如果您需要持久性并且不希望为您的应用程序引入额外的生命周期阶段,那么TDB是最好的方法。如果您的数据集完全适合内存,则不需要持久性,或者您可以为应用程序引入单独的保存并关闭步骤,内存可以快得多。