抽象的問題:我有一個約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