查看 的实现,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) ;
}
如上所示,如果选择了这些选项之一,以后的选项可以覆盖通过命令行参数提供的数据集。最多可以使用一个。话虽如此,您可以--memtdb
使用该选项告诉 Fuseski 使用内存中的 TDB 数据集。根据文档,这应该只用于测试。
根据@andys,TDB(使用该--loc
选项)应该在使用时将值缓存到内存中。如果您需要持久性并且不想为您的应用程序引入额外的生命周期阶段,那么 TDB 是最好的选择。如果您的数据集可以完全放入内存中,您不需要持久性,或者您有能力为您的应用程序引入一个单独的保存和关闭步骤,那么内存中的速度会快得多。