抽象的问题:我有一个约250,000个节点的图形,平均连接约为10个。查找一个节点的连接是一个漫长的过程(10秒可以说)。将节点保存到数据库也需要大约10秒。我可以很快检查一个节点是否已经存在于db中。如果允许并发,但一次不会有超过10个的长请求,那么您将如何遍历该图以获得最快的最高覆盖率。良好的图遍历算法
具体问题:我试图抓取一个网站的用户页面。为了发现新用户,我从已知的用户那里获取朋友列表。我已经导入了约10%的图表,但我一直陷入循环或使用太多记忆记住太多节点。
我目前的执行情况:
def run() :
import_pool = ThreadPool(10)
user_pool = ThreadPool(1)
do_user("arcaneCoder", import_pool, user_pool)
def do_user(user, import_pool, user_pool) :
id = user
alias = models.Alias.get(id)
# if its been updates in the last 7 days
if alias and alias.modified + datetime.timedelta(days=7) > datetime.datetime.now() :
sys.stderr.write("Skipping: %s\n" % user)
else :
sys.stderr.write("Importing: %s\n" % user)
while import_pool.num_jobs() > 20 :
print "Too many queued jobs, sleeping"
time.sleep(15)
import_pool.add_job(alias_view.import_id, [id], lambda rv : sys.stderr.write("Done Importing %s\n" % user))
sys.stderr.write("Crawling: %s\n" % user)
users = crawl(id, 5)
if len(users) >= 2 :
for user in random.sample(users, 2) :
if (user_pool.num_jobs() < 100) :
user_pool.add_job(do_user, [user, import_pool, user_pool])
def crawl(id, limit=50) :
'''returns the first 'limit' friends of a user'''
*not relevant*
目前执行的问题:
- 卡在我已导入拉帮结派,从而浪费时间和进口线程是空闲的。
- 随着他们指出,会增加更多。
所以,边际的改进是值得欢迎的,以及完整的重写。谢谢!
与Robert Tarjan,几个着名的图论(!)算法的发现者有何关系? – 2009-08-24 07:34:54
:)不幸的是,只有匈牙利的这个城市,我们都得到了我们的姓氏。但我们都喜欢电脑和数学。 – 2009-08-24 08:23:38
与这个问题无关,但请注意sys.stderr.write(“... \ n”)可以替换为print >> sys.stderr,“...”(不需要“\ n”,并且使用更平常的印刷说明)。 – EOL 2009-08-24 09:59:12