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

2024-04-26 01:26:59 发布

您现在位置:Python中文网/ 问答频道 /正文

一个进程的一个脚本列表。脚本可以随时使用新的url列表调用。我想避免处理在过去任何时候已经被处理过的URL。在

在这一点上,我只想匹配url,它是非常长的字符串,与之前处理过的所有url进行比较,以确保唯一性。在

我的问题是,一个SQL查询将一个文本URL与一个只有URL的MySQL数据库(比如40000个长文本URL)进行匹配,与我的另一个想法(比如使用Python的shelve模块)对URL进行哈希并保存哈希值的想法相比,如何呢?在

shelf[hash(url)] = 1

shelve可以用于一个有40000个字符串键的字典吗?用40000个带二进制值的数字键怎么办?对于这个简单的需求,有没有选择shelve而不是MySQL?在

或者,如果我使用数据库,那么在MySQL数据库中存储URL散列而不是字符串URL有很大的好处吗?在


Tags: 模块字符串文本脚本数据库url列表sql
3条回答

散列是个好主意。为了在数据库中搜索字符串,它们使用索引。由于可以在字符串上定义比较操作,因此可以构建一个索引,即搜索树,并以对数复杂度处理每个查询

将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

这种方法非常快速:

^{pr2}$

对于大量数据,使用搁置通常是个坏主意。数据库更适合你有大量的数据。在

选项包括:

  • ZODB(Python对象数据库)
  • 任何RDBMS
  • noSQL世界(比如MongoDB,很容易接近而且非常快)

相关问题 更多 >

    热门问题