2011-07-16 21 views
7
meta_map = {} 
    results = db.meta.find({'corpus_id':id, 'method':method}) #this Mongo query only takes 3ms 
    print results.explain() 
    #result is mongo queryset of 2000 documents 

    count = 0 
    for r in results: 
     count += 1 
     print count 
     word = r.get('word') 
     data = r.get('data',{}) 
     if not meta_map.has_key(word): 
      meta_map[word] = data 
    return meta_map 

To jest super, bardzo powolne z jakiegoś powodu.To zajmuje dużo czasu ... jak mogę przyspieszyć ten słownik? (python)

Łącznie 2000 wyników. Poniżej znajduje się przykład dokumentu result (od Mongo). Wszystkie inne wyniki mają podobną długość.

{ "word" : "articl", "data" : { "help" : 0.42454812322341984, "show" : 0.24099054286865948, "lack" : 0.2368313038407821, "steve" : 0.20491936823259457, "gb" : 0.18757527934987422, "feedback" : 0.2855335862138559, "categori" : 0.28210549642632016, "itun" : 0.23615623082085788, "articl" : 0.21378509220044106, "black" : 0.22720575131038662, "hidden" : 0.26172127252557625, "holiday" : 0.27662433827306804, "applic" : 0.1802411089325281, "digit" : 0.20491936823259457, "sourc" : 0.21909218369809863, "march" : 0.2632736571995878, "ceo" : 0.2153108869289692, "donat" : 1, "volum" : 0.2572042432755638, "octob" : 0.2802470156773559, "toolbox" : 0.2153108869289692, "discuss" : 0.26973295489368615, "list" : 0.3698592948408095, "upload" : 0.1802411089325281, "random" : 1, "default" : 0.33044754314072383, "februari" : 0.2899936154686609, "januari" : 0.25228424754983525, "septemb" : 0.1802411089325281, "page" : 0.24675067183234803, "view" : 0.20019523259334138, "pleas" : 0.2839965947961194, "mdi" : 0.2731217555354, "unsourc" : 0.2709524603813144, "direct" : 0.18757527934987422, "dead" : 0.22720575131038662, "smartphon" : 0.2839965947961194, "jump" : 0.3004203939398161, "see" : 0.33044754314072383, "design" : 0.2839965947961194, "download" : 0.19574598998663462, "home" : 0.3004203939398161, "event" : 0.651573574681647, "wikipedia" : 0.21909218369809863, "content" : 0.2471475889083912, "version" : 0.42454812322341984, "gener" : 0.3004203939398161, "refer" : 0.2188507485718582, "navig" : 0.27662433827306804, "june" : 0.2153108869289692, "screen" : 0.27662433827306804, "free" : 0.22720575131038662, "job" : 0.19574598998663462, "key" : 0.3004203939398161, "addit" : 0.22484486630589545, "search" : 0.2878804276884952, "current" : 0.5071530767683105, "worldwid" : 0.20491936823259457, "iphon" : 0.2230524329516571, "action" : 0.24099054286865948, "chang" : 0.18757527934987422, "summari" : 0.33044754314072383, "origin" : 0.2572042432755638, "softwar" : 0.651573574681647, "point" : 0.27662433827306804, "extern" : 0.22190187748860113, "mobil" : 0.2514880028687207, "cloud" : 0.18757527934987422, "use" : 0.2731217555354, "log" : 0.27662433827306804, "commun" : 0.33044754314072383, "interact" : 0.5071530767683105, "devic" : 0.3004203939398161, "long" : 0.2839965947961194, "avail" : 0.19574598998663462, "appl" : 0.24099054286865948, "disambigu" : 0.3195885490528538, "statement" : 0.2737499468972353, "namespac" : 0.3004203939398161, "season" : 0.3004203939398161, "juli" : 0.27243508666247285, "relat" : 0.19574598998663462, "phone" : 0.26973295489368615, "link" : 0.2178125232318433, "line" : 0.42454812322341984, "pilot" : 0.27243508666247285, "account" : 0.2572042432755638, "main" : 0.34870313981256423, "provid" : 0.2153108869289692, "histori" : 0.2714135089366041, "vagu" : 0.24875213214603717, "featur" : 0.24099054286865948, "creat" : 0.26645207330844684, "ipod" : 0.2230524329516571, "player" : 0.20491936823259457, "io" : 0.2447908314834019, "need" : 0.2580912994161046, "develop" : 0.27662433827306804, "began" : 0.24099054286865948, "client" : 0.19574598998663462, "also" : 0.42454812322341984, "cleanup" : 0.24875213214603717, "split" : 0.26973295489368615, "tool" : 0.2878804276884952, "product" : 0.42454812322341984, "may" : 0.2676701118192027, "assist" : 0.1802411089325281, "variant" : 0.2514880028687207, "portal" : 0.3004203939398161, "user" : 0.20491936823259457, "consid" : 0.27662433827306804, "date" : 0.2731217555354, "recent" : 0.24099054286865948, "read" : 0.2572042432755638, "reliabl" : 0.2388872270166464, "sale" : 0.22720575131038662, "ambigu" : 0.23482106920048526, "person" : 0.260801274024785, "contact" : 0.24099054286865948, "encyclopedia" : 0.2153108869289692, "time" : 0.2368313038407821, "model" : 0.24099054286865948, "audio" : 0.19574598998663462 }} 

Cały utarg Proces o 15 sekund ... Co do diabła? Jak mogę przyspieszyć? :)

Edit: Zdaję sobie sprawę, że podczas drukowania licznika w konsoli, to idzie od 0 do 101 bardzo szybko, a następnie zawiesza się na 10 sekund, a następnie kontynuuje od 102 do 2000

może to być problemem MongoDB?

Edit 2: wydrukowaniu Mongo explain() z poniższej zapytania:

{u'allPlans': [{u'cursor': u'BtreeCursor corpus_id_1_method_1_word_1', 
       u'indexBounds': {u'corpus_id': [[u'iphone', u'iphone']], 
           u'method': [[u'advanced', u'advanced']], 
           u'word': [[{u'$minElement': 1}, 
              {u'$maxElement': 1}]]}}], 
u'cursor': u'BtreeCursor corpus_id_1_method_1_word_1', 
u'indexBounds': {u'corpus_id': [[u'iphone', u'iphone']], 
        u'method': [[u'advanced', u'advanced']], 
        u'word': [[{u'$minElement': 1}, {u'$maxElement': 1}]]}, 
u'indexOnly': False, 
u'isMultiKey': False, 
u'millis': 3, 
u'n': 2443, 
u'nChunkSkips': 0, 
u'nYields': 0, 
u'nscanned': 2443, 
u'nscannedObjects': 2443, 
u'oldPlan': {u'cursor': u'BtreeCursor corpus_id_1_method_1_word_1', 
       u'indexBounds': {u'corpus_id': [[u'iphone', u'iphone']], 
           u'method': [[u'advanced', u'advanced']], 
           u'word': [[{u'$minElement': 1}, 
              {u'$maxElement': 1}]]}}} 

Są to statystyki dotyczące pobierania Mongo:

> db.meta.stats(); 
{ 
    "ns" : "inception.meta", 
    "count" : 2450, 
    "size" : 3001068, 
    "avgObjSize" : 1224.9257142857143, 
    "storageSize" : 18520320, 
    "numExtents" : 6, 
    "nindexes" : 2, 
    "lastExtentSize" : 13893632, 
    "paddingFactor" : 1.009999999999931, 
    "flags" : 1, 
    "totalIndexSize" : 368640, 
    "indexSizes" : { 
     "_id_" : 114688, 
     "corpus_id_1_method_1_word_1" : 253952 
    }, 
    "ok" : 1 
} 


> db.meta.getIndexes(); 
[ 
    { 
     "name" : "_id_", 
     "ns" : "inception.meta", 
     "key" : { 
      "_id" : 1 
     }, 
     "v" : 0 
    }, 
    { 
     "ns" : "inception.meta", 
     "name" : "corpus_id_1_method_1_word_1", 
     "key" : { 
      "corpus_id" : 1, 
      "method" : 1, 
      "word" : 1 
     }, 
     "v" : 0 
    } 
] 
+0

Niewielki styl nit, powinieneś używać 'jeśli słowo nie jest w meta_map', [które jest preferowane] (http://docs.python.org/release/2.6/library/stdtypes.html#dict.has_key) zamiast' has_key() ' – dcrosta

+4

Czy próbowałeś już [profilowania] (http://docs.python.org/library/profile.html)?To może rzucić trochę światła na to, co jest wyjątkowo powolne. Nie widzę tutaj niczego strasznego, chyba że "wyniki" nie są w rzeczywistości listą, ale leniwym ładunkiem przypominającym listę lub czymś w tym stylu. – dcrosta

+1

Przetestowałem to na liście 2000 kopii powyższego, a wynik był bardzo, bardzo szybki. Jak, mikrosekundy. – senderle

Odpowiedz

2

Twoje zapytanie zwraca prawie wszystkie dokumenty z Twojej kolekcji (które mogą być poprawne lub nie, w tym przypadku dobra rada bazy danych zawsze przesyła jak najmniej dokumentów/wierszy z serwera do aplikacji), oraz Twoja kolekcja ma około 3 megabajty. Możliwe, że opóźnienie, które widzisz, wynika po prostu z czasu transmisji sieci.

3

Zamiast

if not meta_map.has_key(word): 

powinieneś użyć

if word not in meta_map: 

Nie ma sensu robić data = r.get('data',{}), jeśli nie zamierzasz z niego korzystać.

Nie jest jasne, dlaczego robisz word = r.get('word') ... jeśli "słowo" zawsze istnieje w r, powinieneś po prostu użyć word = r['word']; w przeciwnym razie powinieneś sprawdzić, czy word jest None po otrzymaniu.

Podobnie dane uzyskać.

Spróbuj tego:

for r in results: 
    word = r['word'] 
    if word not in meta_map: 
     meta_map[word] = r['data'] 

W każdym razie razem cytowany jest ogromna ... musi być coś innego dzieje. Byłbym bardzo zainteresowany, aby zobaczyć twój kod do robienia czasu i liczenia liczby wpisów w results.

+0

Dzięki. Myślę, że to problem MongoDB (zobacz problem z liczeniem). – TIMEX

+0

@ TIMEX: "Myślę, że ..."? Wydajesz się raczej niejasny odnośnie tego, co robisz i co mierzysz ... –

-1

Jeśli Twój problem jest naprawdę słownik, może za pomocą setdefault() zamiast najpierw szukać klucza, a następnie ustawienie go może pomóc.

Powiązane problemy