我配置了一个 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/