2010-06-06 6 views
7

J'ai essayé de comparer deux tableaux. L'utilisation de array_intersect ne présente aucun problème. Lorsque vous utilisez array_diff et des tableaux avec ~ 5000 valeurs, cela fonctionne. Quand j'arrive à ~ 10 000 valeurs, le script meurt quand j'arrive à array_diff. Activer error_reporting n'a rien produit.gérer de grands tableaux avec array_diff

J'ai essayé de créer ma propre fonction array_diff:

function manual_array_diff($arraya, $arrayb) { 
    foreach ($arraya as $keya => $valuea) { 
     if (in_array($valuea, $arrayb)) { 
      unset($arraya[$keya]); 
     } 
    } 
    return $arraya; 
} 

source: How does array_diff work?

Je pense qu'il soit moins efficace que que le array_diff officiel, mais il peut gérer des tableaux de ~ 10 000. Malheureusement, les deux array_diffs échouent quand j'arrive à ~ 15 000.

J'ai essayé le même code sur une machine différente et ça marche bien, donc ce n'est pas un problème avec le code ou PHP. Il doit y avoir une limite définie quelque part sur ce serveur particulier. Une idée de comment je peux contourner cette limite ou la modifier ou simplement découvrir ce que c'est?

+0

Avec quelles données avez-vous testé cela? – Gumbo

+0

Probablement parce que cet algorithme est O (N^2). – kennytm

+0

Exécutez-vous ceci dans un navigateur ou une ligne de commande? – tipu

Répondre

3

Ayant rencontré exactement le même problème, j'espérais vraiment une réponse ici. J'ai donc dû trouver mon propre moyen de contourner le problème et j'ai créé le vilain kludge suivant qui fonctionne pour moi avec des tableaux de 50 000 éléments environ. Il est basé sur votre observation que array_intersect fonctionne mais array_diff ne fonctionne pas. Tôt ou tard, cela dépassera également les limites de ressources, auquel cas il sera nécessaire de regrouper les tableaux et de traiter des bits plus petits. Nous traverserons ce pont quand nous y arriverons.

function new_array_diff($arraya, $arrayb) { 
    $intersection = array_intersect($arraya, $arrayb); 
    foreach ($arraya as $keya => $valuea) { 
     if (!isset($intersection[$keya])) { 
      $diff[$keya] = $valuea; 
     } 
    } 

    return $diff; 
} 
1

Dans mon php.ini:

max_execution_time = 60  ; Maximum execution time of each script, in seconds 
memory_limit = 32M   ; Maximum amount of memory a script may consume 

Could différences dans ces paramètres ou encore dans la performance de la machine causer les problèmes? Avez-vous vérifié les journaux d'erreurs de votre serveur Web (si vous en avez exécuté un)?

+0

L'exécution ne prend que quelques secondes, donc le temps d'exécution n'est pas un problème. L'abaissement manuel de memory_limit sur une machine a effectivement tué le script. Cependant, définir memory_limit plus haut sur l'autre machine n'a pas résolu le problème. Dans le cas où vous êtes curieux, il était initialement 40M sur la machine qui causait des problèmes. – burger

+0

Ok, qu'en est-il des journaux d'erreur du serveur? –

1

Vous avez mentionné que cela fonctionne dans un navigateur. Essayez d'exécuter le script via la ligne de commande et voyez si le résultat est différent.

Questions connexes