2011-06-29 19 views
0

我们正在使用Sphinx 2.0.1-beta并希望用PHP-API更新MVA-Attributes。 出现这个错误,但是当我使用命令行工具来验证索引更新成功,我只是得到这个错误信息的方法调用后:如何使用PHP-API更新sphinx MVA属性?

“搜索出错:池内存上装载持久MVA值“。

因此更新不能按预期方式工作。

  1. 在[searchd的] /usr/local/sphinx/etc/test.config的-section我们插入:

mva_updates_pool = 128M

  1. 然后我们实现了一个类更新sql_attr_uint值,它工作得很好。为了使用MVA值,我们稍微扩展了这个类。

当我们调试我们与PHP-API文件代码,

function UpdateAttributes ($index, $attrs, $values, $mva=false) 
     { 
       // verify everything 
       assert (is_string($index)); 
       assert (is_bool($mva)); 

       assert (is_array($attrs)); 
       foreach ($attrs as $attr) 
         assert (is_string($attr)); 

       assert (is_array($values)); 

       foreach ($values as $id=>$entry) 
       { 
         assert (is_numeric($id)); 
         assert (is_array($entry)); 
         assert (count($entry)==count($attrs)); 

         foreach ($entry as $v) 
         { 
           if ($mva) 
           { 
           assert (is_array($v)); 
           foreach ($v as $vv) 
           assert (is_int($vv)); 
           var_dump($vv); 
           } else 
           assert (is_int($v)); 
         } 
       } 
... 

我们的if($ MVA)测试后获得了$ VV值。

  1. 数据结构的一个例子,我们使用作为参数的更新功能:

伪代码:

$attrs: 
array(1) { 
    [0]=> 
    string(12) "attributeKey" 
} 

$值:

array(2) { 

    [182371746]=> 
    array(1) { 
     [0]=> 
     array(2) { 
      [0]=> 
      int(1) 
      [1]=> 
      int(10) 
     } 
    } 

    [182371749]=> 
    array(1) { 
     [0]=> 
     array(2) { 
      [0]=> 
      int(2) 
      [1]=> 
      int(11) 
     } 
    } 
} 

方法调用: $ sphinxClient-> UpdateAttributes('destinationIndex',$ attrs,$ valu es,true);

方法调用返回'3'(成功更新文档的数量(0或更多),失败时返回-1)。

有人有任何想法为什么会发生此错误?

+0

我给了一个答案,但后来看到它并没有真正适用于你的问题 – Rafa

回答

0

错误消息说有很多更新的MVA属性,并且用尽了MVA池内存。

+0

是的,问题是,我设置MVA池内存128M和更新只有五个或六个属性。这样做不可能使用这么多的RAM。 – chris

+0

也许你已经更新了它们的循环或任何复杂的模式?因为回收已释放属性的内存并不总是可能的。 –