2010-06-06 19 views
7

He estado tratando de comparar dos matrices. Usar array_intersect no presenta problemas. Al usar array_diff y arrays con ~ 5,000 valores, funciona. Cuando llego a ~ 10,000 valores, el script muere cuando llego a array_diff. Activar error_reporting no produjo nada.manejo de grandes matrices con array_diff

He intentado crear mi propia función array_diff:

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

fuente: How does array_diff work?

me esperaba que fuera menos eficiente que la que el array_diff oficial, pero se puede manejar matrices de ~ 10.000. Lamentablemente, ambos array_diffs fallan cuando llego a ~ 15,000.

Probé el mismo código en una máquina diferente y funciona bien, por lo que no es un problema con el código o PHP. Debe haber algún límite establecido en algún lugar en ese servidor en particular. ¿Alguna idea de cómo puedo superar ese límite o modificarlo o simplemente descubrir qué es?

+0

¿Con qué datos lo has probado? – Gumbo

+0

Probablemente es porque este algoritmo es O (N^2). – kennytm

+0

¿Está ejecutando esto en un navegador o en una línea de comando? – tipu

Respuesta

3

Al haber encontrado exactamente el mismo problema, realmente estaba esperando una respuesta aquí.

Por lo tanto, tuve que encontrar mi propio camino y se me ocurrió el siguiente feo kludge que me funciona con arreglos de alrededor de 50,000 elementos. Se basa en su observación de que array_intersect funciona, pero array_diff no.

Tarde o temprano esto también desbordará las limitaciones de recursos, en cuyo caso será necesario dividir las matrices y tratar con bits más pequeños. Cruzaremos ese puente cuando lleguemos a él.

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

En mi 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 diferencias en la configuración de éstos o, alternativamente, en rendimiento de la máquina ser la causa de los problemas? ¿Revisó los registros de errores de su servidor web (si ejecuta esto a través de uno)?

+0

Solo lleva unos segundos ejecutar, por lo que el tiempo de ejecución no es un problema. Al bajar manualmente memory_limit en una máquina, se eliminó la secuencia de comandos. Sin embargo, establecer memory_limit en la otra máquina no resolvió el problema. En caso de que tenga curiosidad, inicialmente era 40M en la máquina lo que causaba problemas. – burger

+0

Ok, ¿qué pasa con los registros de errores del servidor? –

1

Mencionó que esto se está ejecutando en un navegador. Intente ejecutar el script a través de la línea de comando y vea si el resultado es diferente.

Cuestiones relacionadas