使用许多进程来过滤一百万条记录

时间:2015-01-23 01:49:57

标签: python multithreading

我的python脚本适用于少数数字:

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

我需要以这样的方式使用线程,以便尽快检查100万条记录。

1 个答案:

答案 0 :(得分:0)

您的代码的问题不在于如何并行化,而是在于每个请求查询一个数字。这意味着处理一百万个号码将在一百万个新的TCP连接上使用一百万个单独的HTTP会话,生成一百万个请求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/ - 但要注意这可能会再次让您在网站运营商遇到麻烦。

相关问题