3

--memFuseki中有一个参数:

fuseki-server --mem  /DatasetPathName

我可以使用它将完整的 tdb 索引加载到内存中以提高查询性能吗?

例如,

fuseki-server --mem  --loc=/tdbpath  /DatasetPathName

/tdbpath 是一个包含 tdb 索引和文件的目录(我使用 tdbloader 加载数据)。

我试了一下,发现添加mem并没有增加内存的使用(对比fuseki-server --loc=/tdbpath /DatasetPathName)。我做错什么了吗?

谢谢

4

1 回答 1

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) ;
        }

如上所示,如果选择了这些选项之一,以后的选项可以覆盖通过命令行参数提供的数据集。最多可以使用一个。话虽如此,您可以--memtdb使用该选项告诉 Fuseski 使用内存中的 TDB 数据集。根据文档,这应该只用于测试。

根据@andys,TDB(使用该--loc选项)应该在使用时将值缓存到内存中。如果您需要持久性并且不想为您的应用程序引入额外的生命周期阶段,那么 TDB 是最好的选择。如果您的数据集可以完全放入内存中,您不需要持久性,或者您有能力为您的应用程序引入一个单独的保存和关闭步骤,那么内存中的速度会快得多。

于 2016-10-25T15:27:23.470 回答