【发布时间】:2016-02-08 14:23:28
【问题描述】:
我正在从一个网站上抓取一些 JSON 数据,并且需要这样做大约 50,000 次(所有数据都是针对 3 年内不同的邮政编码)。我为大约 1,000 次调用超时了程序,每次调用的平均时间为 0.25 秒,整个范围(全部 50,000 次调用)的运行时间约为 3.5 小时。
如何将这个进程分布到我的所有内核上?我的代码的核心几乎是这样的:
with open("U:/dailyweather.txt", "r+") as f:
f.write("var1\tvar2\tvar3\tvar4\tvar5\tvar6\tvar7\tvar8\tvar9\n")
writeData(zips, zip_weather_links, daypart)
writeData() 看起来像这样:
def writeData(zipcodes, links, dayparttime):
for z in zipcodes:
for pair in links:
## do some logic ##
f.write("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n" % (var1, var2, var3, var4, var5,
var6, var7, var8, var9))
zips 看起来像这样:
zips = ['55111', '56789', '68111', ...]
而zip_weather_links 只是每个邮政编码的(URL,日期)字典:
zip_weather_links['55111'] = [('https://website.com/55111/data', datetime.datetime(2013, 1, 1, 0, 0, 0), ...]
如何使用Pool 或multiprocessing 分发此内容?或者分发甚至会节省时间?
【问题讨论】:
-
从 web 服务获取 JSON 数据的方法在哪里?那是不写入文件的瓶颈。您需要为该方法实现 Pool。
-
该方法包含在
writeData中,在另一个方法matchTimeandWeather()中。基本上是这样的:dat = json.loads(page)。我真的只想将 1/4 的负载分配给每个核心(即让一个核心负责邮政编码 a、b 和 c,而另一个核心负责 d、e 和 f,等等。
标签: python parallel-processing web-scraping multiprocessing pool