python - Python 脚本的非常基本的持久性或数据存储

标签 python persistence shelve

我有一个处理 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/

相关文章:

python - 足够安全的 8 字符短唯一随机字符串

python - 根据某些值选择表的某些行

jakarta-ee - 如何获取持久对象的 SingularAttribute 映射值?

perforce - 如何查看搁置的 P4 变更?

在 10.5.8 上从 Macports 安装的 Python 3.1 - 搁置错误(是否有错误?)

python - 通过复制到目录在 Mac 上安装 Django?

java - 来自主键的 JPA 查询类

java - 多对多关系不创建主键

python - Python 3.1.1 中的搁置模块

python - 调整参数 SVM