2011-05-27 11 views
5

Por razones que no discutiré aquí, me veo forzado a analizar un gran directorio de archivos (estamos hablando de 100.000 < x < 1.000.000+) y devolver la lista de archivos como un formación.array_slice con desplazamiento negativo en matrices enormes

Ya estoy en el caché de la lista de archivos, el problema es array_slice.

Sí, porque hay un problema, esta lista de archivo debe ser "paginado" devolverlos en el bloque de 16

Lo que estoy haciendo es la siguiente:

$items_per_page = 16; 
$offset = ($current_page * $items_per_page) + $items_per_page; 
array_slice($array,-$offset,$items_per_page); 

Es fácil ver que en algunas páginas tendremos grandes compensaciones. También a partir de la página cuatro (desplazamiento = -80) hay un gran golpe de rendimiento.

¿Qué podría usar en lugar de array_slice para lograr este tipo de paginación de matriz?

Gracias

+0

100k archivos en el directorio ** one ** es la implementación incorrecta ... – zerkms

+0

Sí, es muy incorrecto. Pero esto es con lo que tengo que trabajar, no es mi elección, después de la fecha límite me aseguraré de cambiar este desastre. – 0plus1

+0

Usar 'preserve_keys' podría ayudar (aunque no estoy seguro). 'array_slice ($ array, - $ offset, $ items_per_page, true);' –

Respuesta

4

Si la matriz se indexa numéricamente (sin omitir los números) puede intentar utilizar un bucle for.

$items_per_page = 16; 
$offset = ($current_page * $items_per_page) + $items_per_page; 
$chunk = array(); 
for($i=$offset;$i<$offset+$items_per_page;$i++){ 
    $chunk[] = $files[$i]; 
} 

Editar:

que acaba de hacer alguna evaluación comparativa para tener una idea. En nuestro servidor, con una matriz de 1 millón de elementos procesados ​​100 veces cada uno, array_slice() tardó 2.5689ms en procesarse. Usar un bucle for tomó 0.0031ms.

+0

Gracias. Si la gente ve esto La solución es perfecta a menos que sea para una sola cosa, la primera página (0) el desplazamiento debe ser 0.Entonces: if ($ current_page> 0) {$ set = ($ current_page * $ items_per_page) + $ items_per_page;} else {$ offset = 0; } – 0plus1

+0

@ 0plus1 Hay un problema con la forma de calcular el desplazamiento. la página 1 te da 1 * 16 = 16 + 16 = 32. la página 0 te daría 0. Nunca verías los resultados 16-31. La forma correcta de obtener la página sería algo así como: '$ offset = (($ current_page-1) * $ items_per_page)% count ($ data);' –

6

Considerar la creación, llenado y manipulación de una tabla de base de datos en lugar de hacer todo esto en la memoria. Un índice en él le permitirá paginar los archivos con un rendimiento razonable.

+0

Ese es el último recurso si todo lo demás falla ... aún así me gustaría encontrar una solución viable para mejorar mi conocimiento. – 0plus1

+0

La sugerencia de Jonathan debe ser más rápida para el acceso, pero igual necesitará llenar (y posiblemente ordenar?) La matriz de tamaño lozano ... –

+0

De acuerdo @ lo que Denis acaba de decir. Usar una base de datos sería 1000 veces mejor, más rápido, más fácil y le permitirá hacer mucho más como ordenar y buscar. Por eso esto obtiene mi voto. –

Cuestiones relacionadas