2012-04-26 2 views
2

これは、我々が解決しようとしている問題です。 私たちは、多数のアイテムの膨大なストリーミングデータを扱っています。あらかじめ定義されたアイテムのリストもあります。ストリームの各アイテムが、あらかじめ定義された非常に巨大なリスト(約400万アイテム)に属しているかどうかを確認する必要があります。ルックアップ/チェック操作は、ここの人々は、私は右の方法でこの問題にアプローチするために読むことができる論文/アルゴリズムへのポインタを与えることに私を助けることができればそれは素晴らしいことだチェック

できるだけ効率的にする必要があります。

おかげで、

答えて

0

あなたは、メインメモリ内のあなたの定義済みリストフィットするソリューションに

  • を来る前に、いくつかの前提条件を絞り込むこともできますか?
  • アクセスパターンはどのように見えますか?ストリーミングされたアイテムのほとんどは同じタイプであるか、すべてのタイプが同じように表現されますか?
  • アイテム小さな(整数/短い文字列)はありますか?そうでない場合、それぞれに固有の識別子が付けられていますか?
  • 事前定義リストは静的であるか、または変更されますか?どのくらいの頻度ですか?

一般に、オブジェクト(またはそれらのオブジェクトを表す一意のキー)のハッシュテーブルを維持し、ストリームを介して入ってくる各オブジェクトをルックアップすることが必要です。ハッシュテーブルは速い検索を提供し、あなたのデータセットが静的である場合、彼らはあなたが記述ユースケースに最適です。しかし、他のソリューションがより良いパフォーマンスを発揮できる状況がいくつかありますが、上記の質問は、これが当てはまるかどうかを明らかにする必要があります。

私はウィキペディアにData StructuresBig-O表記の記事の方にあなたを指しますさらに読書のために

編集:

#!/usr/bin/python 

import random 
import string 
import time 

# return a random username, all lowercase, between n and m characters long 
def generate_username(min_length = 5, max_length = 10): 
    n = random.randint(min_length, max_length) 
    return ''.join(random.sample(string.ascii_lowercase, n)) 

# Build a hash table of 4mil usernames (the 'predefined items') 
users = set() 
for i in xrange(4000000): 
    users.add(generate_username()) 

# Build a 'stream' of usernames to check against the hash table 
stream = [] 
for i in xrange(10000000): 
    stream.append(generate_username()) 

# Measure performance of hash lookups for 10mil usernames 
start = time.clock() 
for name in stream: 
    if name in users: 
     pass #print "%s is present" % name 
end = time.clock() 

print "%fs (%f - %f)" % (end - start, start, end) 

結果:は、私が一緒にPythonでハッシュ検索のパフォーマンスを測定するために、この迅速なプログラムをハッキング:

3.660000s (238.100000 - 241.760000) 

だから、Pythonでは10mストリーミング> 17MB /秒に相当する4秒以内にユーザーの名前を入力します。どのくらい速くそれが本当に必要ですか? :)ご返信用

+0

おかげで、 – thickblood

+0

を1)マイリストをメインメモリに収まらない、あなたの質問に答えるために。 2)アクセスパターンは同じタイプである。 3)私のアイテムは短い文字列です。もう少し詳しく言うと。それらはユーザー名です。 4)また、リストは静的なものです。それは変更されません。私のリストのインクリメンタルな更新は私の心配ではありません。私はハッシュテーブルを使っていることも考えていました。受信データは高速ストリームなので、ストリーム設定で使用される高効率ハッシュアルゴリズムのポインターを探していました – thickblood

+0

ユーザー名はおそらく最大で約10バイトです。 '4mil * 10 = 40MB'、何か不足していますか? – dwurf