2010-06-06 19 views
7

Ho cercato di confrontare due array. L'uso di array_intersect non presenta problemi. Quando si usa array_diff e array con ~ 5.000 valori, funziona. Quando arrivo a ~ 10.000 valori, lo script muore quando arrivo a array_diff. L'attivazione di error_reporting non ha prodotto nulla.gestisce array di grandi dimensioni con array_diff

Ho provato a creare la mia propria funzione array_diff:

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

fonte: How does array_diff work?

mi aspetterei che fosse meno efficiente che quello array_diff ufficiale, ma in grado di gestire array di ~ 10.000. Sfortunatamente, entrambi array_diffs falliscono quando arrivo a ~ 15.000.

ho provato lo stesso codice su una macchina diversa e funziona benissimo, quindi non è un problema con il codice o PHP. Ci deve essere un limite impostato da qualche parte su quel particolare server. Qualche idea su come posso aggirare quel limite o modificarlo o solo scoprire di cosa si tratta?

+0

Quali dati Avete provato che con? – Gumbo

+0

Probabilmente è perché questo algoritmo è O (N^2). – kennytm

+0

Stai eseguendo questo in un browser o una riga di comando? – tipu

risposta

3

Dopo aver riscontrato lo stesso identico problema, speravo davvero in una risposta.

Così, ho dovuto trovare la mia strada intorno ad esso e si avvicinò con la seguente kludge brutto che sta lavorando per me con matrici di circa 50.000 elementi. È basato sulla tua osservazione che array_intersect funziona ma array_diff no.

Prima o poi questo sarà anche traboccare i limiti delle risorse, nel qual caso sarà necessario chunk gli array e trattare con i bit più piccoli. Attraverseremo quel ponte quando ci arriveremo.

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

Nel mio 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 differenze di queste impostazioni o in alternativa in termini di prestazioni della macchina essere la causa dei problemi? Hai controllato i log degli errori del tuo server web (se ne hai eseguito uno tramite)?

+0

Ci vogliono solo pochi secondi per l'esecuzione, quindi il tempo di esecuzione non è un problema. Abbassare manualmente memory_limit su una macchina ha ucciso lo script. Tuttavia, l'impostazione memory_limit più alta sull'altra macchina non ha risolto il problema. Nel caso in cui si curi, inizialmente era 40 M sulla macchina che stava causando problemi. – burger

+0

Ok, per quanto riguarda i log degli errori del server? –

1

Hai accennato che questo è in esecuzione in un browser. Prova a eseguire lo script tramite la riga di comando e verifica se il risultato è diverso.

Problemi correlati