web-dev-qa-db-fra.com

Taille maximale de l'objet qui peut être enregistrée dans memcached avec memcache.py

J'ai besoin de retourner un fichier assez volumineux (11 Mo) à l'utilisateur. Pour certaines raisons, je ne peux pas simplement fournir une URL directe vers le fichier ( http://www.sample.com/mybigfile.exe ); au lieu de cela, il doit être accessible via le code.

Au lieu d'avoir à le lire sur le disque encore et encore, j'ai pensé à l'enregistrer dans memcached (si ce n'est pas une bonne idée, faites-le moi savoir). Tout semble fonctionner, très bien (pas d'erreurs), mais lorsque j'essaie de récupérer le fichier à partir de memcached, j'obtiens toujours None, comme si le fichier n'était pas mis en cache.

Y a-t-il une taille limite pour ce qui peut être enregistré?

Voici le code:

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)
26
cfischer

Il y a deux entrées à ce sujet dans la FAQ memcached :

La réponse à la première est (citant, c'est moi qui souligne):

La taille maximale d'une valeur que vous pouvez stocker dans memcached est de 1 mégaoctet . Si vos données sont plus volumineuses, envisagez la compression côté client ou la division de la valeur en plusieurs clés.

Je suppose donc que votre fichier de 11 Mo est bien trop volumineux pour tenir dans une entrée memcached.

L'augmentation de la taille d'un objet est possible, selon d'autres réponses.

32
Pascal MARTIN

Depuis memcache 1.4.2, il s'agit d'un paramètre configurable par l'utilisateur: ReleaseNotes142 * memcached @ Github

Taille maximale de l'article configurable

Beaucoup de gens ont demandé que memcached soit capable de stocker des éléments supérieurs à 1 Mo. Bien qu'il soit généralement recommandé de ne pas le faire , il est désormais pris en charge sur le ligne de commande.

Quelques personnes éclairées ont également demandé un memcached pour réduire la taille maximale de l'objet. C'est aussi une option.

Le nouveau paramètre -I vous permet de spécifier la taille maximale de l'élément lors de l'exécution. Il prend en charge un suffixe d'unité pour permettre l'expression naturelle de la taille de l'élément.

Exemples:

memcached -I 128k # Refuse items larger than 128k. 
memcached -I 10m  # Allow objects up to 10MB
34
nsanders

Pour résumer les étapes nécessaires:

1) Mettez à jour Memcache vers la version 1.4.2 ou ultérieure.

2) Ajoutez l'indicateur -I 15M (ou autant de mégaoctets) à votre commande run memcache.

C'est soit en ligne de commande, soit dans Ubuntu, ajoutez la ligne

-I 15M

n'importe où dans /etc/memcached.conf et redémarrez le service.

3) Ajoutez l'indicateur nécessaire au client dans memcache.

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

Si vous n'avez pas d'accès direct au client memcache (c'est-à-dire en travaillant via un framework), alors piratez directement le code memcache.

Sur Ubuntu, c'est /usr/local/lib/python2.7/dist-packages/memcache.py. Changez de ligne:

SERVER_MAX_ITEM_LENGTH = 1024 * 1024 

à

SERVER_MAX_ITEM_LENGTH = 1024 * 1024 * 15

Évidemment, vous devrez refaire ce hack si vous mettez à jour memcache, mais c'est une solution très simple et rapide.

22
Alex

La taille maximale des données est de 1 Mo par article

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

Mise à jour: Ceci est une réponse de 2009. Et à cette date, les informations étaient exactes et la source était officielle. En 2014, memcached peut stocker 128 Mo au lieu de 1 Mo (mais les développeurs n'ont pas pris la peine de mettre à jour la FAQ officielle). La seule référence que quelqu'un pourrait trouver sur une page obscure qui sera probablement morte dans un an.

2
The Disintegrator

Personne ne semble répondre à cette partie de la question:

Au lieu d'avoir à le lire sur le disque encore et encore, j'ai pensé à l'enregistrer dans memcached (si ce n'est pas une bonne idée, faites-le moi savoir).

Ce n'est pas une bonne idée. Tous les systèmes de fichiers modernes disposent de mécanismes de mise en cache efficaces. La lecture d'un fichier à partir du disque qui a été lu quelques secondes plus tôt sera généralement toujours dans le cache mémoire. C'est beaucoup plus rapide que d'accéder à memcached sur un réseau.

Si vous exécutez memcached sur 127.0.0.1, la mémoire revendiquée ne sera utilisée que pour ce fichier unique, alors si vous vous fiez simplement à la mise en cache de votre système d'exploitation, la mémoire peut être utilisée à diverses fins en fonction des travaux à effectuer.

1
Jason Smith

L'article suivant explique pourquoi il limite la taille maximale d'un seul fichier à 1 Mo.

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

Fondamentalement, il y a de petits morceaux de pages mémoire dans memcache, à l'intérieur desquels résident les objets.

Et la taille de page par défaut semble être 1M, donc l'objet maximum qu'une page peut contenir est limité à 1M.

Même si vous pouvez le configurer pour augmenter la taille, mais je pense que cela pourrait avoir une sorte de compromis sur les performances.

1
Eric Wang

Si vous utilisez python client memcached, assurez-vous également d'augmenter la limite du fichier client memcache.py avec le serveur memcached.

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

SERVER_MAX_KEY_LENGTH = 250 
SERVER_MAX_VALUE_LENGTH = 1024 * 1024 * 15

vous pouvez voir dans la console memcached (telnet localhost 11211)

dalles de statistiques STAT 48: chunk_size 3677344

1
Pari Rajaram