SlideShare une entreprise Scribd logo
1  sur  22
Python et NoSQL
Performance
      et
Hardware limité
NoSQL
                      Not Only SQL
•   Plusieurs catégories de databases NoSQL

      •   Document Store (MongoDB)

      •   Graph (Neo4j)

      •   Key-Value Store (Redis, Memcached, Cassandra, BigTable)

      •   ...
Pourquoi NoSQL ?

•   Performance !!!

•   Données non structurées

•   Utilisation sur un hardware aux ressources limitées
Première expérience
MongoDB ?
   [52541.307871] [<ffffffff810cc981>] ? handle_mm_fault+0x27a/0x80f
[52541.307886] [<ffffffff812fe6b6>] ? do_page_fault+0x2e0/0x2fc
[52541.307897] [<ffffffff812fc555>] ? page_fault+0x25/0x30
[52541.307907] Disabling lock debugging due to kernel taint
[52541.307918] BUG: Bad page state in process mongod pfn:3d7c2
[52541.307927] page:ffffea0000d73270 flags:0100000000100068 count:1
mapcount:1 mapping:ffff88006036e621 index:7f82c1fea
[52541.307940] Pid: 1326, comm: mongod Tainted: G    B      2.6.32-5-amd64
#1
[52541.307948] Call Trace:
[52541.307959] [<ffffffff810b7a11>] ? bad_page+0x116/0x129
[52541.307968] [<ffffffff810b9b2e>] ? get_page_from_freelist+0x4fd/0x760

                     La VM crash.....
[52541.307983] [<ffffffff81153037>] ? cap_file_mprotect+0x0/0x3
[52541.307995] [<ffffffff8100e242>] ? check_events+0x12/0x20
Redis, notre sauveur
•   Key-Value store

•   Ecrit en C

•   Très performant

•   En mémoire

•   With data structure:

    •   Strings, Hashes, Lists, Sets and Sorted Sets
Ce que nous avons appris
Une BD en mémoire vive ? « J’ai trop de données !!! »
       L’oeuvre complète de Shakespeare représente 5.5Mb, et compressée 2Mb.
       NewsInApp.io ➠ 900 Mb réparti sur 3 bases de données Redis.


Mythe « La mémoire vive est peu onéreuse »
       Mais, la quantité de mémoire est le principal critère de coût chez les hébergeurs
       Amazon EC2: Small Instance = 1.7 Gb, Medium Instance = 3.75...
       Prgmr: 1 Gb = $192 par an, 2 Gb = $345 et 4 Gb = $652


Ne conserver que les données opérationnelles (utilisées)
       Nous ne conversons les news qu’au maximum 20 jours.
Mini moteur de recherche


Démonstration de l’utilisation de
     Redis avec Python
Metaphone
•   Metaphone is a phonetic algorithm, an algorithm for indexing words by their English pronunciation
    See http://en.wikipedia.org/wiki/Metaphone



•   The Double Metaphone phonetic encoding algorithm is the second generation of this algorithm

•   Examples:

    Python       ➠ P0N PTN
    Pythen       ➠ P0N PTN
    Pithon       ➠ P0N PTN
    Piton        ➠ PTN
Metaphone
Python implementation
http://www.atomodo.com/code/double-metaphone/metaphone.py/view
Indexation des topics
topic 3000                topic 1782                  topic 1486
keywords «Johnny Depp»    keywords «John Seymour»     keywords «Wino»
metaphones des keywords   metaphones des keywords     metaphones des keywords
    Johnny ➠ JN, AN              John    ➠ JN, AN            Wino ➠ AN, FN
    Depp ➠ TP                    Seymour ➠ SMR




                                     topic 1737
                                     keywords «Debbie Macomber»
                                     metaphones des keywords
                                            Debbie   ➠ TP
                                            Macomber ➠ MKMPR
Indexation: Metaphone et Redis
Chaque metaphone est une clé dont la valeur est un SET (liste sans doublons). Ce SET contient tous les
topics utilisant ce metaphone
JN ➠ 3000, 1782                  AN ➠ 3000, 1782, 1486               TP ➠ 3000, 1737
Recherche de «Johnny Depp»
•   Chaque metaphone est une clé dont la valeur est un SET (liste sans doublons). Ce SET contient tous les
    topics utilisant ce metaphone
          JN ➠ 3000, 1782                  AN ➠ 3000, 1782, 1486               TP ➠ 3000, 1737




•   Un peu de magie Redis avec la commande SINTER (Intersection de SET)
          SINTER( JN, AN, TP) ➠ 3000
          Intersection de trois listes (sets)
Un exemple de recherche
Que donnerait cette méthode avec le keyword « DEPP » (Metaphone: TP) ?


      •   Debbie Macomber

      •   Johnny Depp
      •   Metaphysia: Earth in Deep Shift
      •   ...
Levenshtein distance

•   Il s’agit d’une métrique de « distance » entre deux mots.
            http://en.wikipedia.org/wiki/Levenshtein_distance



•   Implementation Python: python-Levenshtein
API RESTFul et Django
Gunicorn - Server WSGI
    Fichier « myconfig »

    proc_name = "my_process"
    bind = "unix:/tmp/gunicorn.sock"
    workers = 5
    timeout = 30
    preload_app = True
    daemon = False




   gunicorn_django --config myconfig
Nginx
location / {
    proxy_pass_header   Server;
    proxy_set_header    Host $http_host;
    proxy_redirect      off;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header    X-Real-IP $remote_addr;
    proxy_set_header    X-Scheme $scheme;

    proxy_pass          http://unix:/tmp/gunicorn.sock;
}
Supervisor
[program:api_server]
command=/myenv/bin/gunicorn_django --config myen/conf/myconfig.conf
directory=/myenv/mydjangoproject
autostart=true
autorestart=unexpected
environment=PYTHONPATH='/myenv/mydjangoproject'
environment=DJANGO_SETTINGS_MODULE='settings'



            sudo supervisorctl

            api_server             RUNNING    pid 999, uptime 26 days, 19:50:29

            supervisor> stop api_server
            supervisor> start api_server
•   Redis est ultra performant et simple à maitriser.

•   Utilisation de Redis avec Python :)))))



                        didier.rano@gmail.com
                             @newsinapp

          Vous êtes les bienvenus pour l’alpha de NewsInApp.io

Contenu connexe

Similaire à Python and Redis: A mini search engine

Tout ce que le getting started mongo db ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pasTout ce que le getting started mongo db ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pasPierre-Alban DEWITTE
 
gRPC, ECHANGES A HAUTE FREQUENCE !
gRPC, ECHANGES A HAUTE FREQUENCE !gRPC, ECHANGES A HAUTE FREQUENCE !
gRPC, ECHANGES A HAUTE FREQUENCE !Carles Sistare
 
gRPC, échange à haute fréquence!
gRPC, échange à haute fréquence!gRPC, échange à haute fréquence!
gRPC, échange à haute fréquence!David Caramelo
 
Retour d'expérience sur notre stack de log
Retour d'expérience sur notre stack de logRetour d'expérience sur notre stack de log
Retour d'expérience sur notre stack de logJulien Maitrehenry
 
Algorithme distribués pour big data saison 2 @DevoxxFR 2016
Algorithme distribués pour big data saison 2 @DevoxxFR 2016Algorithme distribués pour big data saison 2 @DevoxxFR 2016
Algorithme distribués pour big data saison 2 @DevoxxFR 2016Duyhai Doan
 
Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines
Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines
Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines Databricks
 
Backday xebia - Chercher la performance efficacement
Backday xebia - Chercher la performance efficacement Backday xebia - Chercher la performance efficacement
Backday xebia - Chercher la performance efficacement Publicis Sapient Engineering
 
S2-01-PHP.pptx
S2-01-PHP.pptxS2-01-PHP.pptx
S2-01-PHP.pptxkohay75604
 
Introduction à Google App Engine - WAQ 2011
Introduction à Google App Engine - WAQ 2011Introduction à Google App Engine - WAQ 2011
Introduction à Google App Engine - WAQ 2011jimmybourassa
 
Conférence #nwxtech5 : Django, du framework pour les perfectionnistes au pony...
Conférence #nwxtech5 : Django, du framework pour les perfectionnistes au pony...Conférence #nwxtech5 : Django, du framework pour les perfectionnistes au pony...
Conférence #nwxtech5 : Django, du framework pour les perfectionnistes au pony...Normandie Web Xperts
 
Introduction Clojure - Geneva JUG - Octobre 2012
Introduction Clojure - Geneva JUG - Octobre 2012Introduction Clojure - Geneva JUG - Octobre 2012
Introduction Clojure - Geneva JUG - Octobre 2012Pablo Tamarit
 
Décryptage des LLMs au-delà de la hype - Lyon Data science
Décryptage des LLMs au-delà de la hype - Lyon Data scienceDécryptage des LLMs au-delà de la hype - Lyon Data science
Décryptage des LLMs au-delà de la hype - Lyon Data scienceMarie-Alice Blete
 
Présentation de Zabbix - Zabbix Lyon - ZUG
Présentation de Zabbix - Zabbix Lyon - ZUGPrésentation de Zabbix - Zabbix Lyon - ZUG
Présentation de Zabbix - Zabbix Lyon - ZUGZabbix User Group
 
XebiConFr 15 - À la découverte des mécanismes internes de Cassandra
XebiConFr 15 - À la découverte des mécanismes internes de Cassandra XebiConFr 15 - À la découverte des mécanismes internes de Cassandra
XebiConFr 15 - À la découverte des mécanismes internes de Cassandra Publicis Sapient Engineering
 

Similaire à Python and Redis: A mini search engine (20)

Tout ce que le getting started mongo db ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pasTout ce que le getting started mongo db ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pas
 
Networxx (intro et fin)
Networxx (intro et fin)Networxx (intro et fin)
Networxx (intro et fin)
 
gRPC, ECHANGES A HAUTE FREQUENCE !
gRPC, ECHANGES A HAUTE FREQUENCE !gRPC, ECHANGES A HAUTE FREQUENCE !
gRPC, ECHANGES A HAUTE FREQUENCE !
 
gRPC, échange à haute fréquence!
gRPC, échange à haute fréquence!gRPC, échange à haute fréquence!
gRPC, échange à haute fréquence!
 
Retour d'expérience sur notre stack de log
Retour d'expérience sur notre stack de logRetour d'expérience sur notre stack de log
Retour d'expérience sur notre stack de log
 
Paris RailsCamp 2009
Paris RailsCamp 2009Paris RailsCamp 2009
Paris RailsCamp 2009
 
GetText / Rails - FR
GetText / Rails - FRGetText / Rails - FR
GetText / Rails - FR
 
GetText / Rails
GetText / RailsGetText / Rails
GetText / Rails
 
Python après 15 ans de JAVA
Python après 15 ans de JAVAPython après 15 ans de JAVA
Python après 15 ans de JAVA
 
Algorithme distribués pour big data saison 2 @DevoxxFR 2016
Algorithme distribués pour big data saison 2 @DevoxxFR 2016Algorithme distribués pour big data saison 2 @DevoxxFR 2016
Algorithme distribués pour big data saison 2 @DevoxxFR 2016
 
Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines
Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines
Deep Learning on Apache Spark: TensorFrames & Deep Learning Pipelines
 
Hackerspace jan-2013
Hackerspace jan-2013Hackerspace jan-2013
Hackerspace jan-2013
 
Backday xebia - Chercher la performance efficacement
Backday xebia - Chercher la performance efficacement Backday xebia - Chercher la performance efficacement
Backday xebia - Chercher la performance efficacement
 
S2-01-PHP.pptx
S2-01-PHP.pptxS2-01-PHP.pptx
S2-01-PHP.pptx
 
Introduction à Google App Engine - WAQ 2011
Introduction à Google App Engine - WAQ 2011Introduction à Google App Engine - WAQ 2011
Introduction à Google App Engine - WAQ 2011
 
Conférence #nwxtech5 : Django, du framework pour les perfectionnistes au pony...
Conférence #nwxtech5 : Django, du framework pour les perfectionnistes au pony...Conférence #nwxtech5 : Django, du framework pour les perfectionnistes au pony...
Conférence #nwxtech5 : Django, du framework pour les perfectionnistes au pony...
 
Introduction Clojure - Geneva JUG - Octobre 2012
Introduction Clojure - Geneva JUG - Octobre 2012Introduction Clojure - Geneva JUG - Octobre 2012
Introduction Clojure - Geneva JUG - Octobre 2012
 
Décryptage des LLMs au-delà de la hype - Lyon Data science
Décryptage des LLMs au-delà de la hype - Lyon Data scienceDécryptage des LLMs au-delà de la hype - Lyon Data science
Décryptage des LLMs au-delà de la hype - Lyon Data science
 
Présentation de Zabbix - Zabbix Lyon - ZUG
Présentation de Zabbix - Zabbix Lyon - ZUGPrésentation de Zabbix - Zabbix Lyon - ZUG
Présentation de Zabbix - Zabbix Lyon - ZUG
 
XebiConFr 15 - À la découverte des mécanismes internes de Cassandra
XebiConFr 15 - À la découverte des mécanismes internes de Cassandra XebiConFr 15 - À la découverte des mécanismes internes de Cassandra
XebiConFr 15 - À la découverte des mécanismes internes de Cassandra
 

Python and Redis: A mini search engine

  • 2.
  • 3. Performance et Hardware limité
  • 4. NoSQL Not Only SQL • Plusieurs catégories de databases NoSQL • Document Store (MongoDB) • Graph (Neo4j) • Key-Value Store (Redis, Memcached, Cassandra, BigTable) • ...
  • 5. Pourquoi NoSQL ? • Performance !!! • Données non structurées • Utilisation sur un hardware aux ressources limitées
  • 7. MongoDB ? [52541.307871] [<ffffffff810cc981>] ? handle_mm_fault+0x27a/0x80f [52541.307886] [<ffffffff812fe6b6>] ? do_page_fault+0x2e0/0x2fc [52541.307897] [<ffffffff812fc555>] ? page_fault+0x25/0x30 [52541.307907] Disabling lock debugging due to kernel taint [52541.307918] BUG: Bad page state in process mongod pfn:3d7c2 [52541.307927] page:ffffea0000d73270 flags:0100000000100068 count:1 mapcount:1 mapping:ffff88006036e621 index:7f82c1fea [52541.307940] Pid: 1326, comm: mongod Tainted: G B 2.6.32-5-amd64 #1 [52541.307948] Call Trace: [52541.307959] [<ffffffff810b7a11>] ? bad_page+0x116/0x129 [52541.307968] [<ffffffff810b9b2e>] ? get_page_from_freelist+0x4fd/0x760 La VM crash..... [52541.307983] [<ffffffff81153037>] ? cap_file_mprotect+0x0/0x3 [52541.307995] [<ffffffff8100e242>] ? check_events+0x12/0x20
  • 8. Redis, notre sauveur • Key-Value store • Ecrit en C • Très performant • En mémoire • With data structure: • Strings, Hashes, Lists, Sets and Sorted Sets
  • 9. Ce que nous avons appris Une BD en mémoire vive ? « J’ai trop de données !!! » L’oeuvre complète de Shakespeare représente 5.5Mb, et compressée 2Mb. NewsInApp.io ➠ 900 Mb réparti sur 3 bases de données Redis. Mythe « La mémoire vive est peu onéreuse » Mais, la quantité de mémoire est le principal critère de coût chez les hébergeurs Amazon EC2: Small Instance = 1.7 Gb, Medium Instance = 3.75... Prgmr: 1 Gb = $192 par an, 2 Gb = $345 et 4 Gb = $652 Ne conserver que les données opérationnelles (utilisées) Nous ne conversons les news qu’au maximum 20 jours.
  • 10. Mini moteur de recherche Démonstration de l’utilisation de Redis avec Python
  • 11. Metaphone • Metaphone is a phonetic algorithm, an algorithm for indexing words by their English pronunciation See http://en.wikipedia.org/wiki/Metaphone • The Double Metaphone phonetic encoding algorithm is the second generation of this algorithm • Examples: Python ➠ P0N PTN Pythen ➠ P0N PTN Pithon ➠ P0N PTN Piton ➠ PTN
  • 13. Indexation des topics topic 3000 topic 1782 topic 1486 keywords «Johnny Depp» keywords «John Seymour» keywords «Wino» metaphones des keywords metaphones des keywords metaphones des keywords Johnny ➠ JN, AN John ➠ JN, AN Wino ➠ AN, FN Depp ➠ TP Seymour ➠ SMR topic 1737 keywords «Debbie Macomber» metaphones des keywords Debbie ➠ TP Macomber ➠ MKMPR
  • 14. Indexation: Metaphone et Redis Chaque metaphone est une clé dont la valeur est un SET (liste sans doublons). Ce SET contient tous les topics utilisant ce metaphone JN ➠ 3000, 1782 AN ➠ 3000, 1782, 1486 TP ➠ 3000, 1737
  • 15. Recherche de «Johnny Depp» • Chaque metaphone est une clé dont la valeur est un SET (liste sans doublons). Ce SET contient tous les topics utilisant ce metaphone JN ➠ 3000, 1782 AN ➠ 3000, 1782, 1486 TP ➠ 3000, 1737 • Un peu de magie Redis avec la commande SINTER (Intersection de SET) SINTER( JN, AN, TP) ➠ 3000 Intersection de trois listes (sets)
  • 16. Un exemple de recherche Que donnerait cette méthode avec le keyword « DEPP » (Metaphone: TP) ? • Debbie Macomber • Johnny Depp • Metaphysia: Earth in Deep Shift • ...
  • 17. Levenshtein distance • Il s’agit d’une métrique de « distance » entre deux mots. http://en.wikipedia.org/wiki/Levenshtein_distance • Implementation Python: python-Levenshtein
  • 18. API RESTFul et Django
  • 19. Gunicorn - Server WSGI Fichier « myconfig » proc_name = "my_process" bind = "unix:/tmp/gunicorn.sock" workers = 5 timeout = 30 preload_app = True daemon = False gunicorn_django --config myconfig
  • 20. Nginx location / { proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_pass http://unix:/tmp/gunicorn.sock; }
  • 22. Redis est ultra performant et simple à maitriser. • Utilisation de Redis avec Python :))))) didier.rano@gmail.com @newsinapp Vous êtes les bienvenus pour l’alpha de NewsInApp.io

Notes de l'éditeur

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n