【问题标题】:What is the indexing penalty in CQEngine for a fast changing collection?对于快速变化的集合,CQEngine 中的索引惩罚是什么?
【发布时间】:2014-05-31 21:55:17
【问题描述】:

我正在考虑将CQEngine 用于需要处理大量实时事件并不时执行一些查询的项目。它可以很好地返回结果,但我注意到集合越大,向其中添加或删除元素就越慢。

我在集合上添加了一些简单的索引,所以我假设延迟是因为在添加/删除的每个事件上都会更新索引。我还收到关于大量事件的 OutOfMemoryError,从索引随着我认为的集合而增加。

所以我的问题是,对于快速变化的集合(经常在集合中添加和删除元素),CQEngine 中的索引损失是多少?

【问题讨论】:

    标签: java performance indexing cqengine


    【解决方案1】:

    如果您在索引的属性中有很多唯一值,您可能会从网站上讨论的IndexQuantization 中受益。

    这是一种在内存使用和检索速度之间进行权衡的方法。但是,如果您有大量唯一值,则减少内存中索引的大小特别有用。

    仅供参考,您也可以在 CQEngine discussion forum 中提问。

    希望有帮助!

    【讨论】:

    • 感谢您抽出宝贵时间回复。不知道 IndexQuantization 是否会有所帮助,因为我正在索引的值虽然是唯一的,但它们不是按顺序排列的。不过会试一试。关于向集合中添加/删除元素,我注意到如果我在集合上有索引,则添加元素比没有索引时要慢。那是因为每次添加/删除索引都会重新组织吗?
    • 这可能取决于您没有提到的索引类型。它们都使用不同的数据结构。但一般来说,在添加每个对象时,不会重新组织索引。 HashIndex 基本上是一个 ConcurrentHashMap>。因此,添加对象将向 CHM(如果已存储具有属性值的对象)或现有 Set(如果已存储)添加新条目(新 Set)。
    • 如果您的值不是按顺序排列的,您可以编写自己的 Quantizer 接口实现。例如,一个简单的实现会将属性值修改为您想要的索引中的条目数(例如 value % desired_index_size)。
    • 此外,如果您要索引的值唯一标识一个对象(即主键类型属性),那么您也可以尝试UniqueIndex
    • 使用 UniqueIndex 解决了内存使用问题(我最初使用 HasIndexes 导致大量内存使用)。对于延误,我正在进一步调查,但可能会在论坛上发布。非常感谢!
    猜你喜欢
    • 2011-07-30
    • 2019-10-18
    • 1970-01-01
    • 2016-12-29
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多