2016-04-08 3 views
1

У меня есть скребковые демпинговые данных в MongoDB, и мой другой модуль пытается извлечь данные из MongoDB, но очень медленно, как по профилю линииPython SpeedUp: чтение данных из MongoDB медленного

Line #  Hits   Time Per Hit % Time Line Contents 
============================================================== 
    607            @profile 
    608            def get_item_iterator(self): 
    609             """ 
    610             build a generator from the item collection 
    611             """ 
    612   1   1  1.0  0.4   query = {'token': self.token} 
    613             # for item in self.collection.find(query): 
    614             #  yield item 
    615             # return (item for item in self.collection.find(query)) 
    616   1   263 263.0  98.9   items_cur=self.collection.find(query) 
    617   1   2  2.0  0.8   return items_cur 

Total time: 0.168562 s 
File: optim_id.py 
Function: Identify at line 618 

Line #  Hits   Time Per Hit % Time Line Contents 
============================================================== 
    618            @profile 
    619            def Identify(self): 
    620             """ 
    621             identify CTAs 
    622             """ 
    623   1   2  2.0  0.0   try: 
    624   1   1  1.0  0.0    flag=0 
    625   1   280 280.0  0.2    items_cur=self.get_item_iterator() 
    626  112  158137 1411.9  93.8    for item in items_cur: 
    627  111   218  2.0  0.1     if flag==0: 

так что вы может видеть, что время попадания огромно, как я могу значительно уменьшить это. Я слышал, что понимание списка происходит быстрее, чем для цикла, и я тоже старался, но без успеха.

Line #  Hits   Time Per Hit % Time Line Contents 
============================================================== 
    607            @profile 
    608            def get_item_iterator(self): 
    609             """ 
    610             build a generator from the item collection 
    611             """ 
    612   1   2  2.0  0.6   query = {'token': self.token} 
    613             # for item in self.collection.find(query): 
    614             #  yield item 
    615   1   310 310.0  99.4   return (item for item in self.collection.find(query)) 

Total time: 0.150235 s 
File: optim_id.py 
Function: Identify at line 616 

Line #  Hits   Time Per Hit % Time Line Contents 
============================================================== 
    616            @profile 
    617            def Identify(self): 
    618             """ 
    619             identify CTAs 
    620             """ 
    621   1   2  2.0  0.0   try: 
    622   1   328 328.0  0.2    item_list=self.get_item_iterator() 
    623   1  139896 139896.0  93.1    item_record=item_list.next() 

моя статистика MongoDB:

db.stats() 
{ 
    "db" : "scrapy_database", 
    "collections" : 102, 
    "objects" : 167007, 
    "avgObjSize" : 1091.1401797529445, 
    "dataSize" : 182228048, 
    "storageSize" : 310439936, 
    "numExtents" : 374, 
    "indexes" : 100, 
    "indexSize" : 6115648, 
    "fileSize" : 469762048, 
    "nsSizeMB" : 16, 
    "extentFreeList" : { 
     "num" : 4, 
     "totalSize" : 6029312 
    }, 
    "dataFileVersion" : { 
     "major" : 4, 
     "minor" : 22 
    }, 
    "ok" : 1 
} 
> collection=db['scraped_rawdata'] 
scrapy_database.scraped_rawdata 
> collection.stats() 
{ 
    "ns" : "scrapy_database.scraped_rawdata", 
    "count" : 100451, 
    "size" : 121793232, 
    "avgObjSize" : 1212, 
    "numExtents" : 13, 
    "storageSize" : 168075264, 
    "lastExtentSize" : 46333952, 
    "paddingFactor" : 1, 
    "paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.", 
    "userFlags" : 1, 
    "capped" : false, 
    "nindexes" : 1, 
    "totalIndexSize" : 3270400, 
    "indexSizes" : { 
     "_id_" : 3270400 
    }, 
    "ok" : 1 
} 

но я запрашивающие элементы которых находится в 111 в общих

> collection.find({"token":"9a9ec6086bb4a4a7ae8cd44b909b139930e561c3"}).count() 
111 
+1

Каков размер базы данных? Используете ли вы индексы для своих коллекций? –

+1

Просто потому, что вы возвращаете только 111 предметов, это не означает, что там не много работы, чтобы добраться туда. В свойстве «токена» заметно «нет индекса», а это означает «сканирование коллекции» для получения результатов. Так что да, это работает через более чем 100 000 записей, чтобы найти нужный вам 111. Добавьте индекс в «токен». Вы также можете рассмотреть сохранение «двоичного» представления этого, а не «шестнадцатеричной» строки. Если вы не хотите использовать «подстроку» этого значения для поиска, тогда двоичная форма займет меньше места и памяти. –

ответ

1

Try увеличить bath_size вашего запроса, оказывается, что каждый пункт требует попадания в базу данных. Также добавьте индекс для поля token.

+0

Это 'cursor.batchSize()' вы ссылаетесь? – aman

+0

Да, это выглядит как правильная функция для установки в драйвере python –

Смежные вопросы