apache-camel - 使用 Camel 对 sesame 中约 300.000 个三元组进行索引

标签 apache-camel rdf sesame

我配置了一个 Camel 上下文来对输入数据进行一些操作,以构建 RDF 三元组。

最后一条路线是使用处理器,使用 Sesame Client API 与单独的 Sesame 实例(在具有 3GB RAM 的 Tomcat 上运行)进行通信并发送添加命令(每个命令包含大约 5 - 10 个语句)。

处理器作为单例运行,相应的“来自”端点有 10 个并发消费者(我尝试使用 1、然后 5、然后 10 - 更多相同的行为)。

我正在使用处理器中的 HttpRepository 来发送添加命令,并且在运行时,我观察到索引性能(快速且)逐渐下降。整个过程开始非常快地索引三元组,但过了一会儿,提交的语句增长非常缓慢。

在 Sesame 方面,我同时使用了 MemoryStore 和 NativeStore,但(性能)行为似乎不太一样。

问题:

  • 如果我想加快索引阶段,建议使用哪种存储类型?
  • Repository.getConnection 是否正在执行某种连接池?换句话说,我可以在每次“添加”处理器工作时打开和关闭连接吗?
  • 话虽如此,我首先需要创建一个存储所有这些三元组的存储,是否最好创建一个“本地”Sail 存储,而不是由远程 Sesame 服务器管理(因此我不会使用 HTTPRepository)?

最佳答案

我假设您添加使用 4 或 5 个语句的事务是有充分理由的,但如果您有办法执行更大的事务,那将显着提高速度。理想的(也是最快的)是在一次交易中将所有 300,000 个三元组发送到商店。

您的问题按顺序排列:

  • 如果您只存储 300,000 个语句,那么存储的选择并不那么重要,因为 native 和内存都可以轻松地以良好的速度处理这种规模。我希望内存存储的性能稍高一些,特别是如果您将其配置为使用非零同步延迟来实现持久性,但 native 的内存占用量较低,当然也更健壮。

  • HTTPRepository.getConnection 本身并不池化实际的 RepositoryConnection,而是在内部池化资源(因此 Sesame 内部使用的实际 HttpConnection 被池化)。因此 getConnection 相对便宜,并且打开和关闭多个连接也很好 - 尽管您可能会考虑为多个添加重复使用同一连接,以便您可以在单个事务中批处理多个添加。

  • 是否存储在本地或远程服务器上实际上取决于您。显然,本地存储会更快,因为您消除了网络延迟以及(反)序列化的成本,但缺点是本地存储在您自己的应用程序之外不容易使用。

关于apache-camel - 使用 Camel 对 sesame 中约 300.000 个三元组进行索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20663660/

相关文章:

tomcat - 我如何找到 Sesame 存储库的位置?

java - 如何在 Apache Camel DSL 中回滚事务?

java - Camel jetty组件,自定义头部过滤策略

resources - RDF 中的前缀命名空间

rdf - OWL 限制 - 定义仅包含具有特定属性值的属性的类

sparql - 单个四边形 + 最基本的 SPARQL 查询 = 1 个耶拿结果,2 个芝麻结果 - 谁是对的?

java - 使用 Camel 中的查询字符串对 REST Web 服务进行 HTTP GET 调用

java - CamelContext 已加载,但路由定义为空

xml - 解析器从 RDF/XML 网页中为我的 Java 网络爬虫提取 URI

java - 我如何在 JRuby 中使用 Sesame 的 RDFXMLParser?