tutunak
@tutunak

Как быстро сравнить два url?

Доброго времени суток!

Стоит задача сравнивать поподающие в систему новыу url файлов на уникальность. количество уникальных url в файле несколько сотен тысяч. Как я понимаю сравнивать полностью строки не очень эффективно. Появилась мысль, что можно сравнивать хеши этих строк. Коллизиями можно пренебречь. Какую базу данных выбрать для хранения hash? Я не нашел в sqlite возможности хранить хеши и достатчоно быстро сравнивать hash урла сравнить с hash урла. Может быть есть какие то готовые варианты? Или необходимо использовать другую базу данных?
  • Вопрос задан
  • 764 просмотра
Пригласить эксперта
Ответы на вопрос 3
@Gokudera
java developer
tutunak И каждый из них я должен сравнить с 100 000 предыдущих (+ этот же файл будет увеличиваться с каждым появлением новых уникальных url).
Так-то в базах данных есть индексирование, они умеют строить деревья который оптимизируют поиск...
>>Появилась мысль, что можно сравнивать хеши этих строк.
Зачем писать велосипед если базы за вас это делают?
Ответ написан
@Milyuta
Системщик
Прошу прощения, затупил конкретно. Все что было до этого не считается.
Если все данные в файле, то как я понимаю мы можем прочитать его с помощью следующего кода:
urls = open('urls.txt', 'r').read()
После того как мы его прочитаем нам его даже на массив строк разбивать не нужно. Есть замечательная функция find. Если строка найдена, то возвращает номер символа с которого начинается строка, если ее нет возвращает -1.
Весть код будет выглядеть так:
url = 'http://google.ru/'
urls = open('urls.txt', 'r').read()
find = urls.find(url)
if find==-1:
   urls.close()
   urls = open('urls.txt', 'w').write(url)
else:
   #тут код который вызываем при нахождении урла в базе.

Если url несколько, то их пилим в массив, и каждый ищем в базе, скорость поиска зашкаливает (если все правильно написать).
Ответ написан
Комментировать
nightvich
@nightvich
ITman
Судя по описанию, вам нужно сделать примитив в виде:
x = []
for i in data.split(" "):
    if i not in x:
        x.append(i)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы