10
votes

Maintenir un grand dictionnaire en mémoire de Django-Python?

J'ai un gros Valeur de clé Dump, que j'ai besoin de rechercher My Django-Python WebApp.

Donc, j'ai suivi des options:

  • Stockez-le comme JSON Dump et chargez-le en tant que dict de Python.
  • stockez-le dans un benne /py et importer la dicte de celui-ci.
  • Utilisez des systèmes ciblés pour ce problème: [Celles-ci sont-ils vraiment destinés à cette usecase? ]
    • mem-cache
    • REDIS
    • toute autre option?

      qui d'en haut est la bonne façon d'aller?

      Comment allez-vous comparer MemCache et Redis?

      mise à jour:

      • Mon dictionnaire est à propos de 5 Mo de taille et deviendra dans le temps.
      • Utilisation de REDIS / MEMCACHACHE ajoute une surcharge de frapper une prise à chaque fois, de sorte que benned.py sera meilleur car il faudrait le temps de le charger à la mémoire, mais après cela ne ferait que des recherches de mémoire.

      • Mon dictionnaire doit être mis à jour tous les jours, envisageant que Dumk.py sera un problème, car nous devons redémarrer le django-serveur pour recharger où, comme je suppose que cela réfléchirait sur La mouche dans Redis et Memcache .

      • one utilise un système comme ReDIS uniquement lorsque vous avez une grande quantité de données et que vous devez rechercher très souvent, dans ce cas, vous donnez une surcharge, comment pouvons-nous atteindre l'avantage ?

        Veuillez partager vos expériences à ce sujet!


4 commentaires

Dépend. Où est ton goulot d'étranglement?


À quelle fréquence allez-vous vérifier la clé si vous êtes inquiet pour les sockets?


Peut être 1000 fois par minute ou encore plus!


Vous n'avez pas à redémarrer Django pour recharger Dumk.py, vous pouvez utiliser la fonction de rechargement intégrée () .


4 Réponses :


2
votes

Memcached, bien qu'un excellent produit, est trompée par Redis dans mon livre. Il offre beaucoup de choses qui memcaches ne le font pas, comme la persistance.

Il offre également des structures de données plus complexes telles que HashSes. Quelle est votre dépotoir de données? Quelle est la taille et quelle taille / quel type de valeurs?


0 commentaires

1
votes

Dans le passé pour un problème similaire, j'ai utilisé l'idée d'une benne basculante. Je penserais que toutes les autres structures de données nécessiteraient une couche convertissant des objets d'un type en objets Python. Cependant, je penserais toujours que cela dépendrait de la taille de données et de la quantité de données que vous manipulez. MemCache et Redis devraient avoir une meilleure indexation et rechercher des ensembles de données vraiment volumineux et des choses comme la recherche basée sur REGEX. Donc, ma recommandation serait

JSON - si vous servez les données sur http à un autre service Fichier Python - Si la structure de données n'est pas trop grande et que vous n'avez pas besoin d'un type de recherche spécial

memcache et redis - si les données deviennent vraiment grandes


0 commentaires

1
votes

5 Mo n'est pas si grand. Vous pouvez le conserver en mémoire en cours et je vous recommande de le faire, jusqu'à ce qu'il soit clair du profilage et de tester que cette approche ne répondait pas à vos besoins. Toujours faire la chose la plus simple possible.

La communication de la prise ne présente pas d'elle-même une grande partie de la tête. Vous pouvez probablement le remettre un peu en utilisant une prise de domaine UNIX. Dans tous les cas, si vous ne conservez pas vos données en cours, vous devrez parler de la sorte de tuyau.


2 commentaires

D'accord


@Yugaljindle Non, je pense que vous devez conserver vos données en cours jusqu'à ce que le profilage réel montre qu'il provoque un problème.



7
votes

Pour choisir MemCache ou Redis, ils sont capables de dizaines de milliers de demandes par seconde sur du matériel bas de gamme (par exemple, 80 000 REQ / S pour REDIS sur C2D Q8300 ). Avec des latences de bien en dessous de 1 ms. Vous dites que vous faites quelque chose dans l'ordre de 20 Demander une seconde, de sorte que la performance sage c'est vraiment non-problème.

Si vous choisissez l'option benned.py , vous n'avez pas besoin de redémarrer Django pour recharger. Vous pouvez faire votre propre reloacher simple:

bennedump.py: xxx

code DJAGO: xxx < hr>


3 commentaires

Redis partie est vraiment informatif +1 pour cela. Recharger () est connu pour moi, mais je l'ai rechargé après chaque MTime , qui prend 2 secondes pour charger et raccrocher la requête de la page. Donc, je ne peux pas prendre les frais généraux de 2 secondes à mi de neuf - je préférerais redémarrer le serveur une fois que j'ai mis à jour ma DICT. De toute façon recharger n'est pas la question ici. Redis partie est!


Qu'est-ce que vous voulez dire "pour chaque mitime"? Vous avez dit que le dictionnaire est modifié quotidiennement, vous devrez le recharger une fois par jour.


Ya .. ici mitime est 1 jour. C'est bien, j'ai dit que cela pourrait être mis à jour dans une journée et demie. Mais, n'aimait pas vraiment. Redis Info était important