Хороший алгоритм обхода графа

Абстрактная проблема: у меня есть график около 250 000 узлов, а средняя скорость соединения составляет около 10. Поиск узлаs соединения - это долгий процесс (скажем, 10 секунд). Сохранение узла в базе данных также занимает около 10 секунд. Я могу очень быстро проверить, присутствует ли узел в БД. Допуская параллелизм, но не имея более 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*

Проблемы текущей реализации:

Застрял в кликах, которые ямы уже импортировали, тратя тем самым время и импортирующие потоки простаивают.Добавлю больше, как они будут указаны.

Таким образом, маргинальные улучшения приветствуются, а также полностью переписаны. Спасибо!

Ответы на вопрос(4)

Ваш ответ на вопрос