2012-04-13 11 views
1

膨大な量の文字列を格納して重複をチェックするための最良の方法は何ですか?が 膨大な量のユニークな文字列を保存する最も速い方法は何ですか?

  • ランダムアクセス時間は何である
    • 重複チェックの速度
    • 挿入する新しい文字列時間
    • ストレージ容量のハードディスク上:

      は、我々は、我々の優先順位について考える必要が私たちの目標が高速の重複チェックで新しい文字列を挿入する時間(ランダムアクセスまたは記憶スペースなしe matter)? 私はSQLデータベースについて考えますが、このソリューションにはDBのどれが最適ですか? MySQLのようなSQL DBを使用すれば、どのストレージエンジンが最適でしょうか? (もちろん、データ量のためにメモリを除外しなければならない)

    +0

    "ランダムアクセス時間"の意味について詳しく説明できますか?データが文字列のセットである場合、「追加」、「含む」、「削除」のみが実行されます。 –

    +0

    あなたの問題についてもっと詳しく教えてもらえれば、例えば実行時に文字列を使っていてもメモリに収まらなければならない場合など、リスト/ハッシュ/配列に格納するのが最善の方法です。まだ存在していない場合にのみ項目を追加し、最後に配列を書き出します(実行後に必要な場合は、やり直してください)。 – deed02392

    +0

    異なる文字列のコレクションを集めようとしていますか、重複をフィルタリングしていますか?目的は何ですか?特に:重複の予想される部分量はどのくらいですか?ほとんどすべてが重複していると思いますか、まれなイベントですか?すべての新しい値をデータベースに追加しますか? –

    答えて

    4

    入力文字列にハッシュ関数を使用する。出力ハッシュはレコードの主キー/ idになります。

    DBは、このハッシュ/ ID /主キーがあるなら、あなたは確認することができます。

    • を、それはdoesntの場合:これは新しい文字列です。文字列とハッシュを含む新しいレコードをidとして追加します。
    • 実行される場合:ロードされたレコードの文字列が入力文字列と同じであることを確認します。
      • 文字列が同じ場合:文字列が異なる場合は、
      • が重複しています。これは衝突です。解決するにはcollision resolutionスキームを使用してください。 (以下の例のカップル)

    あなたはスピードと文字列とハッシュ衝突要件/保証の予想数に基づいて、使用するハッシュ関数/スキーム/強度を検討する必要があります。

    衝突を解決するにはいくつかの方法:

    • 同じテーブルに新しいハッシュを思い付くために第二のハッシュ関数を使用します。
    • レコードを(たとえばNULLで)マークし、セカンダリの「衝突」テーブルでより強力な第2ハッシュ関数(より広いドメインを使用)で繰り返します。クエリで、文字列が衝突しているとマークされている場合(例:NULL)、衝突テーブルで再度参照します。また、この2番目のテーブルにさらなる衝突がないように、dynamic perfect hashingを使用することもできます。

    もちろん、これがどれくらいの持続性を必要としているか、文字列の数を取ることが予想されるかによって、実際にはデータベースを使わずに直接メモリに格納することができます。

    +0

    プライマリキーとしてのハッシュ?どのように衝突を処理するのですか? –

    +0

    @NicolasRepiquet updated応答 –

    +0

    なぜ主キーを使うのですか?'ハッシュ'カラム(非一意)と '値'カラム(文字列を含む)と 'ハッシュ'カラムのクラスタードインデックスを持つ単純なテーブルは、「ハッシュ= 'ハッシュ'と値= '...'は、速くて簡単なことですが、やや遅い挿入を犠牲にしています。 –

    1

    文字列を格納するためのサフィックスツリーを生成します。 http://www.daimi.au.dk/~mailund/slides/Ukkonen-2005.pdfのようなUkkonenのアルゴリズムは、サフィックスツリーを作成する方法をいくつかの洞察力を与えるでしょう。このサフィックスツリーを格納する方法はいくつかあります。しかし、いったん生成されると、参照時間は非常に短くなります。

    3

    あなたはのNoSQLソリューションを検討する必要があります。

    Redisを。ユースケースの一部はRedisのを使用して解決:

    memcached(ジョシュアL.カールソンはRedis in Actionの著者です)。 memcachedのとRedisの間にいくつかの比較:one of their success storiesとしてOMGPOPのドロー何かをカウント

    Membase/Couchbase。 RedisのとMemBase値との比較:

    いくつかの質問:

    • 文字列のセットがどのように大規模なのですか?
    • アプリケーションを重いものと読むか重いものにしますか?または両方?
    • どのくらいの頻度でデータをディスクに永続化したいですか?
    • ここにはN最新の文字列が必要ですか?

    これが役に立ちます。

    +0

    ありがとう、レディスについて知りませんでした。私は以前それについて聞いていなかったと信じています。 +1 –

    関連する問題