Очень простое сохранение или хранение данных для скрипта Python - PullRequest
2 голосов
/ 03 апреля 2011

У меня есть скрипт, который обрабатывает список URL-адресов.Сценарий может быть вызван в любое время с новым списком URL-адресов.Я хочу избежать обработки URL-адреса, который уже был обработан в любое время в прошлом.

На этом этапе все, что я хочу сопоставить, - это URL-адреса, которые представляют собой действительно длинные строки по отношению ко всем ранее обработанным URL-адресам, чтобыобеспечить уникальность.

Мой вопрос заключается в том, как SQL-запрос, сопоставляющий текстовый URL с базой данных MySQL, содержащей только URL-адреса (скажем, 40000 длинных текстовых URL-адресов), сравнивается с моей другой идеей хеширования URL-адресов и сохранения хэшейиспользуя, скажем, модуль полки Python?

shelf[hash(url)] = 1

Можно ли использовать полки для словаря с 40000 строковыми ключами?Как насчет 40000 числовых ключей с двоичными значениями?Любые ошибки с выбором полки над MySQL для этого простого требования?

Или, если я использую БД, есть ли огромное преимущество для хранения хешей URL в моей БД MySQL вместо строковых URL?

Ответы [ 3 ]

1 голос
/ 03 апреля 2011

Храните URL-адреса в наборе, который обеспечивает O (1) для поиска предметов, и отложите его. При таком количестве URL-адресов сохранение и восстановление занимают очень мало времени и памяти:

import shelve

# Write URLS to shelve
urls= ['http://www.airmagnet.com/', 'http://www.alcatel-lucent.com/',
       'http://www.ami.com/', 'http://www.apcc.com/', 'http://www.stk.com/',
       'http://www.apani.com/', 'http://www.apple.com/',
       'http://www.arcoide.com/', 'http://www.areca.com.tw/',
       'http://www.argus-systems.com/', 'http://www.ariba.com/',
       'http://www.asus.com.tw/']

s=set(urls)                        # Store URLs as set - Search is O(1)
sh=shelve.open('/tmp/shelve.tmp')  # Dump set (as one unit) to shelve file
sh['urls']=s
sh.close()

sh=shelve.open('/tmp/shelve.tmp')  # Retrieve set from file
s=sh['urls']
print 'http://www.apple.com/' in s # True
print 'http://matan.name/'    in s # False

Этот подход довольно быстрый:

import random
import string
import shelve
import datetime


urls=[''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(50))
          for i in range(40000)]
s=set(urls)
start=datetime.datetime.now()
sh=shelve.open('/tmp/test.shelve')
sh['urls']=urls
end=datetime.datetime.now()
print end-start
1 голос
/ 03 апреля 2011

Использование полки в общем случае - плохая идея для больших объемов данных. База данных лучше подходит для вас, у вас есть много данных.

Варианты:

  • ZODB (база данных объектов Python)
  • любая СУБД
  • мир NoSQL (например, MongoDB, который легко доступен и очень быстр)
0 голосов
/ 03 апреля 2011

Хеширование - хорошая идея.Для поиска строк в базах данных они используют индексы.Поскольку можно определить операцию сравнения для строк, можно построить индекс, который является деревом поиска, и обрабатывать каждый запрос с логарифмической сложностью

...