2011-06-29 21 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

也許你已經更新了它們的循環或任何複雜的模式?因爲回收已釋放屬性的內存並不總是可能的。 –