pymemcache python memcached

pymemcache - install memcached python



Tamaño máximo del objeto que se puede guardar en memcached con memcache.py (7)

A partir de memcache 1.4.2, este es un parámetro configurable por el usuario: ReleaseNotes142 * memcached @ Github

Tamaño máximo configurable del artículo

Muchas personas han pedido que memcached pueda almacenar elementos de más de 1 MB, aunque generalmente se recomienda que uno no haga esto, ahora se admite en la línea de comandos.

Algunas personas iluminadas también han pedido que memcached reduzca el tamaño máximo de los elementos. Esa es también una opción.

El nuevo parámetro -I le permite especificar el tamaño máximo del elemento en tiempo de ejecución. Admite una unidad postfix para permitir la expresión natural del tamaño del elemento.

Ejemplos:

-I 15M

Necesito devolver un archivo bastante grande (11MB) al usuario. Por ciertas razones, no puedo proporcionar una URL directa al archivo ( http://www.sample.com/mybigfile.exe ); en su lugar se debe acceder a través del código.

En lugar de tener que leerlo desde el disco una y otra vez, pensé en guardarlo en memcached (si no es una buena idea, avíseme). Todo parece funcionar, está bien (sin errores), pero cuando intento recuperar el archivo de memcached siempre obtengo Ninguno, como si el archivo no estuviera en caché.

¿Hay un límite de tamaño para lo que se puede guardar?

Aquí está el código:

def download_demo(): """ Returns the demo file """ KEY = "xyz" TIME = 86400 #24 hours buff = memc.get(KEY) if not buff: file = open(FILENAME, ''r'') buff = file.read() memc.set(KEY, buff, TIME) print "Content-Type:application/x-download/nContent-Disposition:attachment;filename=%s/nContent-Length:%s/n/n%s" % (os.path.split(FILENAME)[-1], len(buff), buff)


El siguiente artículo explica por qué limita el tamaño máximo de un solo archivo a 1M.

http://www.mikeperham.com/2009/06/22/slabs-pages-chunks-and-memcached/

Básicamente, hay pequeños fragmentos de páginas de memoria en memcache, dentro de los cuales residen los objetos.

Y el tamaño de página predeterminado parece ser 1M, por lo que el objeto máximo que puede contener una página está limitado a 1M.

Aunque puede configurarlo para aumentar el tamaño, pero creo que esto podría tener algún tipo de compromiso de rendimiento.


El tamaño máximo de los datos es de 1 mb por artículo.

http://code.google.com/p/memcached/wiki/FAQ#What_is_the_maximum_data_size_you_can_store?_%281_megabyte%29

Actualización: Esta es una respuesta de 2009. Y en esa fecha la información era precisa y la fuente oficial. Ahora, en 2014, memcached puede almacenar 128 MB en lugar de 1 MB (pero los desarrolladores no se molestaron en actualizar las preguntas frecuentes oficiales). La única referencia que alguien podría encontrar es una página oscura que probablemente esté muerta en un año.


Hay dos entradas al respecto en las preguntas frecuentes de memcached :

La respuesta a la primera es (citando, énfasis mío) :

El tamaño máximo de un valor que puede almacenar en memcached es de 1 megabyte . Si sus datos son más grandes, considere la compresión del lado del cliente o la división del valor en varias claves.

Así que supongo que su archivo de 11MB es demasiado grande para caber en una entrada de memcached.

Aumentar el tamaño de un objeto es posible, según otras respuestas.


Nadie parece abordar esta parte de la pregunta:

En lugar de tener que leerlo desde el disco una y otra vez, pensé en guardarlo en memcached (si no es una buena idea, avíseme).

Esta no es una buena idea Todos los sistemas de archivos modernos tienen mecanismos de caché eficientes. Por lo general, la lectura de un archivo del disco que se leyó unos segundos antes todavía estará en la memoria caché. Esto es mucho más rápido que acceder a memcached a través de una red.

Si está ejecutando memcached en 127.0.0.1, la memoria que reclamó solo se usará para ese único archivo, por lo tanto, si simplemente confía en el almacenamiento en caché de su sistema operativo, la memoria se puede usar para varios propósitos, dependiendo de los trabajos disponibles.


Para resumir los pasos necesarios:

1) Actualice Memcache a la versión 1.4.2 o posterior.

2) Agregue la bandera -I 15M (o sin embargo muchos megabytes) a su comando de ejecución de memcache.

Esa es la línea de comandos, o en Ubuntu, agregue la línea

import memcache memc = memcache.Client([''localhost''], server_max_value_length=1024*1024*15) memc.set(KEY, buff, TIME)

a cualquier lugar en /etc/memcached.conf y reinicie el servicio.

3) Agregue la bandera necesaria al cliente en memcache.

SERVER_MAX_KEY_LENGTH = 250 SERVER_MAX_VALUE_LENGTH = 1024 * 1024 * 15

Si no tiene acceso directo al cliente de memcache (es decir, trabajando a través de un marco), simplemente piratee el código de memcache directamente.

En Ubuntu, es /usr/local/lib/python2.7/dist-packages/memcache.py. Cambia la línea:

SERVER_MAX_ITEM_LENGTH = 1024 * 1024

a

SERVER_MAX_ITEM_LENGTH = 1024 * 1024 * 15

Obviamente, deberá volver a realizar este pirateo si actualiza memcache, pero es una solución muy simple y rápida.


Si está utilizando el cliente memcached de Python, asegúrese de aumentar el límite en el archivo memcache.py del cliente junto con el servidor memcached.

~ / anaconda / lib / python2.7 / site-packages / memcache.py

SERVER_MAX_KEY_LENGTH = 250 SERVER_MAX_VALUE_LENGTH = 1024 * 1024 * 15

Se puede ver en la consola de memcached (telnet localhost 11211)

estadísticas losas STAT 48: chunk_size 3677344