2016-05-01 12 views
-2

私は、mysqlデータベースから膨大な数のオブジェクトを読み込んだ後、同じmysqlデータベースからオブジェクトのリストを読み込みます。wamp enviornemntで永遠に実行されないPHPスクリプトを効率的に実行するには...?

PHPを使用して、不規則な動作をチェックするために各リストを繰り返していきたいと思います。しかし、私はスクリプトを実行するたびに実行するために永遠にかかる(これまで私はそれが完了したとは思わない)。私ができる最適化はありますか?実行するのにこの時間がかかりません...?最初のリストにはおよそ64150のエントリがあり、2番目のリストには約1748のエントリがあります。

これは、一般的に擬似コードでのコードの外観です。この時点の結果が瞬時にしている...しかし、私はこれを行うとき、それは、永遠に実行するのにかかる、それは決して終わらないように思えるまでは

// an array of size 64000 containing objects in the form of {"id": 1, "unique_id": "kqiweyu21a)_"} 
$items_list = []; 

// an array of size 5000 containing objects in the form of {"inventory: "a long string that might have the unique_id", "name": "SomeName", id": 1}; 
$user_list = []; 

...

foreach($items_list as $item) 
{ 
    foreach($user_list as $user) 
    { 
     if(strpos($user["inventory"], $item["unique_id"]) !== false) 
     { 
      echo("Found a version of the item"); 
     } 
    } 
} 

なお、エコーはまれべき$ items_listと$ user_list配列がほぼ即座に生成されるため、問題はMySQLでは発生しません。リスト全体を反復しようとすると永遠に続くようになります...

+3

'私は実行できる最適化がありますか?この実行に時間がかからないのですか? ' - はい! JOINされたデータベースクエリを使用して、その通常の動作をチェックします。大量のデータをPHPにロードして入れ子にした配列を反復処理しないでください –

+1

それぞれのIDを*キー*として配列をインデックス化すると、配列キーで高速に検索できます。現在のデータベースサイズ* –

+1

私はここで何か間違って見ることができません:-( – Strawberry

答えて

0

130Mの反復では、休憩を追加することはまれに起こるにもかかわらず、何らかの形で役立ちます...

foreach($items_list as $item) 
{ 
    foreach($user_list as $user) 
    { 
     if(strpos($user["inventory"], $item["unique_id"])){ 
      echo("Found a version of the item"); 
      break; 
     } 
    } 
} 

代替ソリューション1 PHP 5.6で:PTHREADSを使用して大きな配列を分割してスレッドにプールすることもできます。ブレークでは、これが確実に改善されます。

代替ソリューション2:PHP7を使用すると、配列の操作やループに関するパフォーマンスが向上します。

また、ループの前に配列をソートしようとします。あなたが見ているものに依存しますが、非常に頻繁に配列をソートする前に、条件が見つかるとループ時間を可能な限り制限します。

0

例はほとんど再生できません。複製が可能な例、つまりアレイにアクセスするだけで非常に迅速に完了する場合、すなわち2〜3秒かかる場合、2つのループを指定する必要があります。つまり、検索対象の文字列がキロバイト以上(質問では提供されていません)か、ループが実行されている間にデータベースアクセスなどの何かが起きていることを意味します。

0

SQLに検索させることができます。あなたが必要とする列を共有しないので、私は見たものだけを引っ張ります。

SELECT i.unique_id, u.inventory 
FROM items i, users u 
WHERE LOCATE(i.unique_id, u inventory) 
関連する問題