2015-01-23 6 views
0

У меня есть сценарий питона, который хорошо работает в течение нескольких цифр:использовать множество процессов для фильтрации миллиона записей

def ncpr (searchnm): 
    import urllib2 
    from bs4 import BeautifulSoup 

    mynumber = searchnm 
    url = "http://www.domain.com/saveSearchSub.misc?phoneno=" + mynumber 

    soup = BeautifulSoup(urllib2.urlopen(url)) 
    header = soup.find('td', class_='GridHeader') 

    result = [] 
    for row in header.parent.find_next_siblings('tr'): 
     cells = row.find_all('td') 
     try: 
      result.append(cells[2].get_text(strip=True)) 
     except IndexError: 
      continue 
    if result: 
    pass 
    else: 
    return str(i) 


with open("Output.txt3", "w") as text_file: 

    for i in range(9819838100,9819838200): 
    myl=str(ncpr(str(i))) 
    if myl != 'None': 
     text_file.write((myl)+'\n') 

Он проверяет диапазон 100 номеров и возвращать целое число, которое не присутствует в базе данных. Для обработки 100 записей требуется несколько секунд. Мне нужно обработать миллион чисел, начиная с разных диапазонов. .

9819800000 9819900000 
9819200000 9819300000 
9829100000 9829200000 
9819100000 9819200000 
7819800000 7819900000 
8819800000 8819900000 
9119100000 9119200000 
9119500000 9119600000 
9119700000 9119800000 
9113100000 9113200000 

Этот словарь будет генерироваться из списка поставки:

mylist=[98198, 98192, 98291, 98191, 78198, 88198, 91191, 91195, 91197, 91131] 
mydict={} 

for mynumber in mylist: 
    start_range= int(str(mynumber) + '00000') 
    end_range=int(str(mynumber+1) +'00000') 
    mydict[start_range] = end_range 

Мне нужно использовать потоки таким образом, что я могу проверить 1 миллиона записей как можно быстрее.

+0

Вам нужно будет переместить импорт за пределы 'def ncpr()', иначе они будут называться 1 миллион раз. Как правило, хорошая идея минимизировать код в цикле. – nathancahill

+0

только один вопрос. если ваша работа может быть разделена на подзадачи, они независимы? – qqibrow

+0

Да. Как вы можете видеть, ряды номеров не перекрывают друг друга. Выходной файл (Output.txt3) также может быть раздельным, если требуется. Но один файл легче загружать. – shantanuo

ответ

0

Проблема с вашим кодом заключается не столько в том, как распараллелить его, сколько в том, что вы запрашиваете один номер за запрос. Это означает, что обработка миллиона чисел будет генерировать миллион запросов, используя миллион отдельных сеансов HTTP на миллион новых TCP-соединений, до www.nccptrai.gov.in. Я не думаю, что веб-мастеру понравится.

Вместо этого вы должны найти способ получения дампа базы данных. Если это невозможно, перестройте свой код, чтобы повторно использовать одно соединение для выдачи нескольких запросов. Это обсуждается здесь: How to Speed Up Python's urllib2 when doing multiple requests

Выдавая все ваши запросы по одному соединению, вы избегаете тонны накладных расходов, а также получаете большую пропускную способность, и, надеюсь, завершаетесь тем, что сможете отправлять один пакет за запрос и получать один пакет за ответ. Если вы живете за пределами Индии, далеко от сервера, вы также можете немного выиграть от HTTP Pipelining, где вы выдаете несколько запросов, не дожидаясь более ранних ответов. Есть своего рода хак, который показывает, что здесь: http://code.activestate.com/recipes/576673-python-http-pipelining/ - но будьте осторожны, это может снова вызвать у вас больше проблем с оператором сайта.

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