-4

私の PHP コードには多くの foreach ループが含まれており、結果は完全に破滅的です。実行に時間がかかりすぎます。

これに代わるものはありますか。私はすべての提案を受け入れます。

フラッシュベースのクライアントを実装し、actionscript を使用してクライアントの CPU を利用してロジックを実行する可能性があると考えています。

または、C/C++ を使用してサーバー自体で計算が要求される部分を処理し、PHP に結果を返す方法はありますか。

次の関数は 1,000,000 回呼び出されます。

public function performEnrichmentAnalysis($geneSet) {
    /**
     * $mainArray is a multi dimentional array.
     * EntrezID | Set (0/1) | pValue | rank
     */
    $mainArray = array();
    $finalArray = array();
    $originalGenesScore = 0;
    $randomGenesScore = 0;
    $u = 0;
    $EntrezID = array();
    $Set = array();
    $pValue = array();
    $Rank = array();
    $originalGenes = $geneSet->getGenes();
    $memeberCount = $geneSet->getGeneCount();
    $randomGenes = $this->geneExpressionData->getRandomGenes($memeberCount);
    /**
     * Copy the elements of original and random gene sets to main array.
     */
    foreach ($originalGenes as $key => $value) {
        $pVal = $this->geneExpressionData->getExpressionValue($value);
        $array = array('EntrezID' => $value, 'Set' => 0, 'pValue' => $pVal, 'Rank' => 999);
        array_push($mainArray, $array);
        unset($array);
    }
    foreach ($randomGenes as $key => $value) {
        $pVal = $this->geneExpressionData->getExpressionValue($value);
        $array = array('EntrezID' => $value, 'Set' => 1, 'pValue' => $pVal, 'Rank' => 999);
        array_push($mainArray, $array);
        unset($array);
    }
    /**
     * sort the multi dimentaional array based on p-values
     */
    foreach ($mainArray as $key => $row) {
        $EntrezID[$key] = $row['EntrezID'];
        $Set[$key] = $row['Set'];
        $pValue[$key] = $row['pValue'];
        $Rank[$key] = $row['Rank'];
    }
    array_multisort($pValue, SORT_ASC, $mainArray);

    /**
     * Assign ranks to the genes
     */
    for ($index = 0; $index < count($mainArray); $index++) {
        $row = $mainArray[$index];
        $row['Rank'] = $index + 1;
        $row['Score'] = 0;
        //print_r($row['Rank']);
        array_push($finalArray, $row);
    }

    /**
     * Calculate scores for each gene
     */
    for ($i = 0; $i < count($finalArray); $i++) {
        for ($j = $i + 1; $j < count($finalArray); $j++) {
            if ($finalArray[$j]['Set'] != $finalArray[$i]['Set']) {
                $finalArray[$i]['Score']++;
            }
        }
    }

    /**
     * Calculate score for the entire set and get universal U and z score.
     */
    for ($counter = 0; $counter < count($finalArray); $counter++) {
        if ($finalArray[$counter]['Set'] == 0) {
            $originalGenesScore += $finalArray[$counter]['Score'];
        }
        if ($finalArray[$counter]['Set'] == 1) {
            $randomGenesScore += $finalArray[$counter]['Score'];
        }
    }

    if ($originalGenesScore > $randomGenesScore) {
        $u = $randomGenesScore;
    } else {
        $u = $originalGenesScore;
    }

    $zNumerator = $u - (($memeberCount * $memeberCount) / (2));
    $zDenominatorSquared = ($memeberCount * $memeberCount * ($memeberCount + $memeberCount + 1)) / 12;

    $z = $zNumerator / sqrt($zDenominatorSquared);

    if (abs($z) > 2.303) {
        $this->temp001++;
    } elseif (abs($z) > 1.605) {
        $this->temp005++;
    } else {
        $this->tempRemaining++;
    }
}
4

1 に答える 1

2

うーん、簡単に答えられるものではないですね。はい、C++ を知っていると仮定すると、コードは C++ で書き直すことができます。そのための大きな障害は見当たりません。

オリジナルを C++ コードに変換する方法を考え出してから、 yourと othergeneSetを表す構造を構築する必要があります。配列に$mainArray使用します。std::vector

このコードは実際には Web コンテンツ自体を生成しないため、関数をサーバーにインストールされた C++ プログラムの呼び出しに簡単に置き換えることができます。この関数を呼び出す機能を C++ で実際に実装することをお勧めします。これが 1M 回呼び出される場合は、C++ コードの一部を 1M 回呼び出すよりも、C++ で 1M 回呼び出す方がよいからです。

于 2013-03-02T23:42:11.957 に答える