我有一个处理 URL 列表的脚本。可以随时使用新的 URL 列表调用该脚本。我想避免处理过去任何时候已经处理过的 URL。
此时,我想要匹配的只是 URL,它们是非常长的字符串,与所有先前处理的 URL 相匹配,以确保唯一性。
我的问题是,将文本 URL 与仅包含 URL(例如 40000 个长文本 URL)的 MySQL 数据库相匹配的 SQL 查询与我对 URL 进行哈希处理并使用 Python 的搁置保存哈希值的其他想法进行比较模块?
shelf[hash(url)] = 1
shelve 可以用于具有 40000 个字符串键的字典吗?如果有 40000 个带有二进制值的数字键呢?对于这个简单的需求选择 shelve 而不是 MySQL 有什么问题吗?
或者,如果我使用数据库,在 MySQL 数据库中存储 URL 哈希值而不是字符串 URL 是否有巨大的好处?
最佳答案
将 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
关于python - Python 脚本的非常基本的持久性或数据存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5528518/