【问题标题】:Solr sorting, precisionStep and memory usageSolr 排序、precisionStep 和内存使用
【发布时间】:2012-07-13 02:19:43
【问题描述】:

我们目前有一个 Solr 实例,其中包含大约 5000 万个文档。有一个 long 字段,我们经常使用标准的 long 字段类型进行排序,precisionStep 为零:

<fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
<field name="row" type="long" indexed="true" stored="true" />

在进行排序时,需要将索引加载到内存中。在我们的例子中,row 的值范围很大,我们需要 500m 到 1g 的堆来进行排序。

我想知道是否可以以某种方式减少此内存使用要求。

增加row 字段的precisionStep 会减小索引大小,从而减少排序所需的内存量吗?这样做对分拣速度有权衡吗?并且使用更高精度的步长排序是否仍然完全正确(行值必须严格按顺序排列)?

现在 1GB 的堆是可以接受的,但我有点担心如果我们添加更多具有更多 row 值的文档,那么内存需求将会变得太高。


(在 jpountz 的回答之后添加)

虽然目前这适合内存,但它不会随着我们预计在接下来的几个月中添加的文档数量而扩展。我们可能会从 Solr 获得未排序的结果,并在客户端使用基于磁盘的java-merge-sort 对它们进行排序。

【问题讨论】:

    标签: solr lucene


    【解决方案1】:

    precisionStep 参数仅与范围查询相关。要执行排序,Lucene 需要在field cache 中加载字段值。长为 8 个字节,您的字段的字段缓存应该需要大约 8B * 50M ~ 400 MB。如果你真的需要一个 long 这个字段,没有办法减少内存使用(另一方面,使用 int 只需要 ~200MB)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      相关资源
      最近更新 更多