3

私は symfony 1.4 + propel 1.6 を使用しており、すべてのユーザー データベースを ElasticSearch にエクスポート (インデックス) したいと考えています。

すべてのスクリプトを作成しましたが、1 つの問題を除けば、すべて問題なく動作しています。約 20.000~ 回繰り返すループを作成し、毎回 memory_usage が増加します。

問題は次のとおりです。すべての参照を破棄しているため、そうすべきではありません。

Propel は、私が作成するすべてのオブジェクトへの静的参照をどこかに残していると思います。ただし、インスタンスのプールを既に無効にしているため、見つかりません。

誰も似たような問題を抱えたことがありますか?PHP のメモリ制限をデバッグするにはどうすればよいか、誰かが考えているのではないでしょうか? (webgrind はありません) このコードのデバッグにここ数時間費やしましたが、まだ修正できません。

// optimizations
    gc_enable();
    Propel::getConnection()->useDebug(false);
    Propel::disableInstancePooling();
// the while
    $offset = 0;
    $perpage = 10;
    $c = SearchUserQuery::create()->limit($perpage);
    do {
        $rs = SearchUserPeer::doSelectStmt($c);
        while ($row = $rs->fetch(PDO::FETCH_NUM))
        {
            $instance = new SearchUser();
            $instance->hydrate($row);
            $data = $instance->toElastic(); // this line makes a lot of memory leak
            $_document = new Elastica\Document($instance->getPrimaryKey(), $data);
            $_type->addDocument($_document);
            unset($_document, $instance);
        }
        $c->offset($offset += $perpage);
    } while( $rs->rowCount() );

関数 $instance->toElastic は次のようになります。

public function toElastic()
{
    return Array(
        'profile' => $this->toArray(BasePeer::TYPE_COLNAME, false),
        'info' => $this->getUserInfo()->toArray(BasePeer::TYPE_COLNAME, false),
        'branches' => $this->getElasticBranches(),
    );
}

/**
 * @return array(id,name)
 */
public function getElasticBranches()
{
    $branches = Array();
    foreach ($this->getsfGuardUser()->getUserBranchs() as $branch)
        $branches[] = Array(
            'id' => $branch->getBranchId(),
            'name' => $branch->getName()
        );
    return $branches;
}
4

1 に答える 1

5

設定を解除する前にこれを試しましたか?

// garbage collector problem in PHP 5.3
$instance->clearAllReferences(true);

// remove the variable content before removing the address (with unset)
$instance = null;
$_document = null;
$_type = null;

この回答からさらにヒントを得ることができます。3 つのリンクを見ると、そのうちの 1 つがフランス語であっても、非常に興味深いものがあります。

于 2013-01-31T20:38:58.137 に答える