2010-06-06 14 views
7

Ich habe versucht, zwei Arrays zu vergleichen. Die Verwendung von array_intersect zeigt keine Probleme. Wenn Sie array_diff und Arrays mit ~ 5.000 Werten verwenden, funktioniert es. Wenn ich zu ~ 10.000 Werten komme, stirbt das Skript, wenn ich zu array_diff komme. Das Aktivieren von error_reporting hat nichts ergeben.Umgang mit großen Arrays mit array_diff

Ich habe versucht, meine eigene array_diff Funktion erstellen:

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

Quelle: How does array_diff work?

Ich würde erwarten, dass es weniger effizient sein, dass als die offizielle array_diff, aber es Arrays von ~ 10.000 verarbeiten kann. Leider schlagen beide array_diffs fehl, wenn ich ~ 15.000 erreiche.

Ich habe den gleichen Code auf einer anderen Maschine und es läuft gut, so ist es kein Problem mit dem Code oder PHP. Es muss irgendwo auf diesem bestimmten Server ein Limit festgelegt werden. Irgendeine Idee, wie ich diese Grenze umgehen oder ändern oder einfach herausfinden kann, was es ist?

+0

Mit welchen Daten haben Sie das getestet? – Gumbo

+0

Wahrscheinlich liegt es daran, dass dieser Algorithmus O (N^2) ist. – kennytm

+0

Führen Sie dies in einem Browser oder einer Befehlszeile aus? – tipu

Antwort

3

Nachdem ich genau das gleiche Problem hatte, hoffte ich wirklich auf eine Antwort hier.

Also musste ich meinen eigenen Weg finden und kam zu dem folgenden hässlichen Klud, der für mich mit Arrays von etwa 50.000 Elementen funktioniert. Es basiert auf Ihrer Beobachtung, dass array_intersect funktioniert, array_diff jedoch nicht.

Früher oder später wird dies auch die Ressourcenbeschränkungen überschreiten, in diesem Fall wird es notwendig sein, die Arrays Chunk und kleinere Bits zu behandeln. Wir werden diese Brücke überqueren, wenn wir dazu kommen.

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

In meiner 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 

Könnte Unterschiede in dieser Einstellung oder alternativ in der Maschinenleistung, die Probleme verursacht werden? Haben Sie Ihre Webserver-Fehlerprotokolle überprüft (wenn Sie dies durchlaufen lassen)?

+0

Die Ausführung dauert nur wenige Sekunden, daher ist die Ausführungszeit kein Problem. Das manuelle Verringern von memory_limit auf einer Maschine hat das Skript beendet. Die Einstellung von memory_limit auf der anderen Maschine hat das Problem jedoch nicht gelöst. Falls Sie neugierig sind, war es zunächst 40M auf der Maschine, die Probleme verursachte. – burger

+0

Ok, was ist mit Serverfehlerprotokollen? –

1

Sie erwähnten, dass dies in einem Browser ausgeführt wird. Versuchen Sie, das Skript über die Befehlszeile auszuführen, und prüfen Sie, ob das Ergebnis anders ist.

Verwandte Themen