2009-09-17 20 views
22

Necesito devolver un archivo bastante grande (11 MB) al usuario. Por ciertas razones, no puedo simplemente proporcionar una URL directa al archivo (http://www.sample.com/mybigfile.exe); en su lugar, se debe acceder a través del código.Tamaño máximo de objeto que se puede guardar en memcached con memcache.py

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

¿Existe 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) 
+0

Si Memcache se está ejecutando localmente, probablemente no ganes mucho leyendo su contenido, ya que, suponiendo que haya suficiente memoria RAM disponible, el sistema de archivos ya lo tendrá en caché en la memoria RAM. – radiospiel

Respuesta

31

Hay dos entradas sobre que en el memcached FAQ:

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

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

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

Es posible aumentar el tamaño de un objeto, según otras respuestas.

+4

Nota: Memcached ahora le permite cambiar el límite de tamaño en el lanzamiento – NoviceCoding

+18

Estos enlaces ahora están muertos –

+3

En las versiones más nuevas de Memcached puede establecer el límite de hasta 128 mb usando la opción -I (linux.die.net/man/1/memcached). Considere cambiar a Redis para almacenar objetos grandes. – maxwell2022

1

El tamaño máximo de 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 2009. Y en esa fecha, la información era precisa y la fuente era oficial. Ahora en 2014, memcached puede almacenar 128mb en lugar de 1mb (pero los desarrolladores no se molestaron en actualizar las preguntas frecuentes oficiales). La única referencia que alguien puede encontrar es una página oscura que probablemente estará muerta en un año.

+1

Este es un enlace muerto ahora – maxwell2022

+0

No puedo encontrar ninguna fuente nueva allí. Parece que fue mala publicidad? –

+0

En las versiones más nuevas de memcached puede establecer el límite en 128 mb utilizando la opción '-I' (http://linux.die.net/man/1/memcached). Personalmente cambio a Redis para almacenamiento de objetos grandes. – maxwell2022

30

A partir de Memcache 1.4.2, este es un parámetro configurable por el usuario:

http://code.google.com/p/memcached/wiki/ReleaseNotes142

configurable tamaño máximo de elemento

Muchas personas han preguntado por memcached para poder almacenar artículos más grande que 1MB, mientras que generalmente se recomienda que uno no haga esto, ahora es compatible con en la línea de comandos.

Algunas personas ilustradas también han pedido que Memcached reduzca el tamaño máximo de artículo . Esa también es una opción.

El nuevo parámetro -I le permite especificar el tamaño máximo de elemento en runtime.Es compatible con un postfix de la unidad para permitir la expresión natural del tamaño del elemento .

Ejemplos:

memcached -I 128k # Refuse elementos mayores de 128k.

memcached -I 10m # Permitir objetos de hasta 10 MB

+0

Al igual que en la otra respuesta, estos enlaces también están muertos ahora – e4c5

21

para resumir los pasos necesarios:

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

2) Agregue el indicador -I 15M (o cuantos megabytes) a su comando de ejecución de memcache.

Esa es una de las líneas de comandos o en Ubuntu, añada la línea

-I 15M 

a cualquier parte /etc/memcached.conf y reinicie el servicio.

3) Agregue la bandera necesaria al cliente en Memcache.

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

Si usted no tiene acceso directo al cliente memcache (es decir, trabajando a través de un marco), a continuación, sólo modificar el código de Memcache directamente.

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

SERVER_MAX_ITEM_LENGTH = 1024 * 1024

a

SERVER_MAX_ITEM_LENGTH = 1024 * 1024 * 15

Obviamente, usted tiene que hacer este truco otra vez si se actualiza Memcache pero es una solución muy simple y rápida.

+0

El argumento que desea pasar al cliente memcache de python es en realidad server_max_value_length ver [memcache.py:163](https://github.com/linsomniac/python-memcached /blob/master/memcache.py#L163) –

+0

Gracias, he actualizado el ejemplo. – Alex

1

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 trozos de páginas de memoria en Memcache, dentro de la cual residen los objetos.

Y el tamaño de página predeterminado parece ser 1M, por lo que el objeto máximo que una página puede contener 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.

0

Si está utilizando el cliente memcached de python, también 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 memcached (telnet localhost 11211)

estadísticas losas STAT 48: chunk_size 3677344

0

Nadie parece hacer frente a esta parte de la pregunta:

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

Esto no es una buena idea. Todos los sistemas de archivos modernos tienen mecanismos de caché eficientes. La lectura de un archivo del disco que se leyó unos segundos antes generalmente 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 afirmó solo se usará para ese único archivo, como si simplemente se basara en el almacenamiento en caché de su sistema operativo, la memoria se puede usar para diversos fines, dependiendo de la trabajos a mano.

Cuestiones relacionadas