【发布时间】: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 对它们进行排序。
【问题讨论】: