Problema astratto: ho un grafico di circa 250.000 nodi e la connettività media è di circa 10. Trovare le connessioni di un nodo è un processo lungo (diciamo 10 secondi). Anche il salvataggio di un nodo nel database richiede circa 10 secondi. Posso verificare se un nodo è già presente nel db molto rapidamente. Consentendo la concorrenza, ma senza avere più di 10 richieste lunghe alla volta, come avresti attraversato il grafico per ottenere la copertura più alta il più veloce.Algoritmo di attraversamento grafico buono
Problema concreto: sto cercando di analizzare le pagine degli utenti di un sito web. Per scoprire nuovi utenti sto recuperando la lista amici da utenti già noti. Ho già importato circa il 10% del grafico, ma continuo a rimanere bloccato in cicli o usando troppa memoria ricordando troppi nodi.
mio attuale implementazione:
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*
Problemi di implementazione attuale:
- rimane incastrato in cricche che ho già importato, sprecando così tempo e le filettature importazione sono inattivi.
- Aggiungerà più come vengono evidenziati.
Così, i miglioramenti marginali sono benvenuti, così come le riscritture complete. Grazie!
Qualsiasi relazione con Robert Tarjan, lo scopritore di numerosi algoritmi (!) Notevoli di teoria dei grafi? –
:) Purtroppo, solo la città in Ungheria da cui entrambi abbiamo il nostro cognome. Ma entrambi amiamo il computer e la matematica. –
Non correlato alla domanda, ma si noti che sys.stderr.write ("... \ n") può essere sostituito da print >> sys.stderr, "..." (non c'è bisogno di "\ n", e usare della dichiarazione di stampa più usuale). – EOL