2

URL のリストを処理するスクリプトがあります。スクリプトは、URL の新しいリストを使用していつでも呼び出すことができます。過去に処理済みの URL を処理することは避けたいと考えています。

この時点で、一意性を確保するために、以前に処理されたすべての URL に対して非常に長い文字列である URL を照合する必要があります。

私の質問は、URL のみの MySQL データベース (たとえば 40000 の長いテキスト URL) に対してテキスト URL を照合する SQL クエリは、URL をハッシュし、たとえば Python の shelve モジュールを使用してハッシュを保存するという私の他の考えとどのように比較されるのでしょうか?

shelf[hash(url)] = 1

shelve は、40000 個の文字列キーを持つ辞書に使用できますか? バイナリ値を持つ 40000 個の数値キーではどうでしょうか? この単純な要件のために、MySQL ではなく棚上げを選択する際の落とし穴はありますか?

または、DB を使用する場合、MySQL DB に文字列 URL の代わりに URL ハッシュを格納することには大きな利点がありますか?

4

3 に答える 3

1

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
于 2011-04-03T08:49:41.900 に答える
1

一般に、大量のデータに対してシェルフを使用することはお勧めできません。データベースは、大量のデータがある場合に適しています。

オプションは次のとおりです。

  • ZODB(Pythonオブジェクトデータベース)
  • 任意のRDBMS
  • noSQLの世界(簡単にアクセスでき、非常に高速なMongoDBなど)
于 2011-04-03T08:56:32.933 に答える
0

ハッシュは良い考えです。データベース内の文字列を検索するには、インデックスを使用します。文字列の比較操作を定義できるため、検索ツリーであるインデックスを作成し、各クエリを対数の複雑さで処理することができます

于 2011-04-03T08:43:14.997 に答える