2011-04-13 15 views
5

Tengo un objeto (en realidad, una matriz de objetos) de 302 MB. Cuando trato de guardarlo en caché con memcached, no funciona, no importa cuánta memoria le doy a memcached, aparentemente porque memcached tiene un límite de 1MB en objetos que puede almacenar en caché. (Podría estar equivocado acerca de esa última parte. No he podido encontrar una gran documentación.)Almacenamiento en caché de un objeto de 302 MB

¿Alguna sugerencia sobre cómo almacenar esta cosa en caché? Estoy usando PHP/Symfony en Linux.

+0

¿Cómo es tan grande? ¡Eso parece bastante grande! –

+2

lo guarda en caché en un sistema de archivos en lugar de en Memcache, o almacena en caché cada elemento de la matriz individualmente – nos

+0

Almacenamiento en caché y 320MB ... whooooooooooooooooooooooop – diEcho

Respuesta

12

Quoting

15.5.5.4: ¿Cuál es el tamaño máximo de un objeto que puede almacenar en Memcache y es configurable que?

El tamaño máximo predeterminado del objeto es 1MB. En memcached 1.4.2 y posterior puede cambiar el tamaño máximo de un objeto utilizando la opción de línea de comando -I.

Para las versiones anteriores, para aumentar este tamaño, debe volver a compilar memcached. Puede modificar el valor de POWER_BLOCK dentro del archivo slabs.c dentro de la fuente.

En memcached 1.4.2 y superior, puede configurar el tamaño de objeto máximo soportado utilizando la opción -I de línea de comando. Por ejemplo, para aumentar el tamaño máximo del objeto a 5 MB:

$ memcached -I 5m 

Sin embargo, aun cuando el aumento de la memoria, esto no es una buena elección de la OMI. Una mejor idea sería dividir el objeto en trozos más pequeños y luego almacenar en caché partes indididuales de él.

Citando Why are items limited to 1 megabyte in size?

Respuesta corta: Debido a cómo funciona el algoritmo del asignador de memoria.

Respuesta larga: el motor de almacenamiento de memoria de Memcached (que se puede conectar/ajustar en el futuro ...), utiliza un enfoque de planchas para la gestión de la memoria. La memoria se divide en trozos de losas de diferentes tamaños, comenzando en un número mínimo y ascendiendo por un factorial hasta el mayor valor posible.

Diga el valor mínimo es de 400 bytes, y el valor máximo es 1 megabyte, y el factorial es 1,20:

losa 1 - 400 bytes losa 2 - 480 bytes de la losa 3 - 576 bytes ... etc.

Cuanto más grande es la losa, más espacio hay entre ella y la losa anterior. Por lo tanto, cuanto mayor es el valor máximo, menos eficiente es el almacenamiento de la memoria. Memcached también tiene que preasignar algo de memoria para cada losa que existe, por lo que establecer un factorial más pequeño con un valor máximo más grande requerirá incluso más gastos generales.

No tenemos otra razón por la que no le gustaría hacer eso ... Si estamos hablando de una página web y que estamos tratando de almacenar valores/carga tan grande, es probable que hacer algo mal .A ese tamaño, tomará una cantidad notable de tiempo para cargar y descomprimir la estructura de datos en la memoria, y es probable que su sitio no funcione muy bien.

Si realmente desea almacenar elementos de más de 1MB, puede recompilar memcached con un valor slabs.c: POWER_BLOCK editado, o utilizar el ineficiente malloc/backend gratuito. Otras sugerencias incluyen una base de datos, MogileFS, etc.

-1

No hay forma de que necesite una instancia de 302Mb de un objeto (o una matriz de objetos) para almacenar en caché.

Sin ver el código, no puedo sugerir cómo ... pero tiene que haber una buena forma de refactorizar para almacenar en caché en menor escala.

0

Usted tal vez podría utilizar la memoria compartida (pero con ese tamaño votaría en contra de ella) o utilizar una unidad de memoria RAM.

¿Es esto para un servidor web o está buscando un caché común para múltiples servidores web?

Todavía me uno a los demás cuando dicen que probablemente necesites otro enfoque. Intenta explicar qué tipo de datos es el que quieres almacenar en caché.

1

En alternativa, se puede cambiar el límite de rapidez por editar el archivo de configuración [/etc/memcached.conf] añadiendo:

# Increase limit 
-I 512M 

Después de reiniciar el servicio.

Cuestiones relacionadas