PHP – * fast * serialize / unserialize?

Tengo un script PHP que construye un árbol de búsqueda binario sobre un archivo CSV bastante grande (5MB +). Esto es bueno y todo, pero toma aproximadamente 3 segundos leer / analizar / indexar el archivo.

Ahora pensé que podría usar serialize() y unserialize() para acelerar el proceso. Cuando el archivo CSV no ha cambiado mientras tanto, no tiene sentido volver a analizarlo.

Para mi horror, creo que llamar a serialize() en mi objeto de índice lleva 5 segundos y produce un gran archivo de texto (19 MB), mientras que unserialize() demora insoportables 27 segundos para volver a leerlo. Las mejoras se ven un poco diferentes. 😉

Entonces, ¿hay un mecanismo más rápido para almacenar / restaurar gráficos de objetos grandes desde / hacia el disco en PHP?

(Para aclarar: estoy buscando algo que tarde significativamente menos que los 3 segundos antes mencionados para hacer el trabajo de deserialización).

Parece que la respuesta a tu pregunta es no.

Incluso si descubres una opción de “formato de serialización binaria”, lo más probable es que sea más lenta para lo que imaginas.

Por lo tanto, lo que debe considerar utilizar (como han mencionado otros) es una base de datos, memoria o servicio web en línea.

Me gustaría agregar las siguientes ideas también:

  • almacenamiento en caché de solicitudes / respuestas
  • su script PHP no se apaga sino que se convierte en un servidor de red para responder consultas
  • o, me atrevo a decirlo, cambie la estructura de datos y el método de consulta que está utilizando actualmente

var_export debería ser mucho más rápido ya que PHP no tendrá que procesar la cadena en absoluto:

 // export the process CSV to export.php $php_array = read_parse_and_index_csv($csv); // takes 3 seconds $export = var_export($php_array, true); file_put_contents('export.php', ''); 

Luego incluye export.php cuando lo necesites:

 include 'export.php'; 

Dependiendo de la configuración de su servidor web, es posible que tenga que chmod export.php para hacerlo ejecutable primero.

Prueba igbinary … hizo maravillas para mí:

http://pecl.php.net/package/igbinary

Primero debes cambiar la forma en que funciona tu progtwig. divide el archivo CSV en trozos más pequeños. Este es un datastore de IP, supongo. .

Convierte todas las direcciones IP a entero o largo.

Entonces, si llega una consulta, puede saber qué parte buscar. Hay funciones para hacer esto. De modo que 0 a 2 ^ 32 convierten todas las direcciones IP en 5000K / 50K en total 100 archivos más pequeños. Este enfoque te proporciona una serialización más rápida.

Piensa inteligentemente, código ordenado;)

veo dos opciones aquí

serialización de cadenas, en la forma más simple algo así como

  write => implode("\x01", (array) $node); read => explode() + $node->payload = $a[0]; $node->value = $a[1] etc 

serialización binaria con paquete ()

  write => pack("fnna*", $node->value, $node->le, $node->ri, $node->payload); read => $node = (object) unpack("fvalue/nre/nli/a*payload", $data); 

Sería interesante comparar ambas opciones y comparar los resultados.

Si desea velocidad, escribir o leer desde el sistema de archivos en menos de lo óptimo.

En la mayoría de los casos, un servidor de base de datos podrá almacenar y recuperar datos mucho más eficientemente que un script PHP que está leyendo / escribiendo archivos.

Otra posibilidad sería algo así como Memcached .

La serialización de objetos no se conoce por su rendimiento sino por su facilidad de uso y definitivamente no es adecuada para manejar grandes cantidades de datos.

¿Qué hay de usar algo como JSON para un formato para almacenar / cargar los datos? No tengo idea de qué tan rápido es el analizador JSON en PHP, pero generalmente es una operación rápida en la mayoría de los idiomas y es un formato liviano.

http://php.net/manual/en/book.json.php

SQLite viene con PHP, podrías usar eso como tu base de datos. De lo contrario, podrías intentar usar sesiones, entonces no tienes que serializar nada, solo guardas el objeto PHP sin procesar.