2009-04-01 5 views
1

私はコード演習であるアナグラムジェネレータを構築しており、約633,000行(1行に1語)の単語リストを使用しています。私はこのプログラムをRubyのもとで書きましたが、これを変更してオンラインで展開したいと考えています。ファイルをテキストとして保存するか、データベースにインポートする必要がありますか?

私のホスティングサービスは、唯一のRubyベースのソリューションとして、Ruby on Railsをサポートしています。私は自分のマシンでホストし、より小さなフレームワークを使うことを考えましたが、現時点でのセキュリティ問題に対処したくありません。

私はデータベース駆動型(CRUD)アプリケーション用にRoRのみを使用しています。しかし、私はこのようにsqliteデータベースを移植したことはないので、これは2つの部分からなる質問です。

1)これをデータベースにインポートする必要がありますか?もしそうなら、これを行うための最良の方法は何ですか?その場合、sqliteを使って単純なものにしておきたいと思います。

2)「フラットファイル」は良いですか?私は作成や更新をしていなくても、単語のリストをチェックするだけです。

ありがとうございます。

+0

もう少し情報が役立ちます:なぜあなたはデータベースに変更する必要があると感じますか?すべての単語をメモリに読み込むという複数のユーザーとオーバーヘッドが心配ですか?あなたの現在の実装はどのようにファイルを使用していますか?あなたはすぐにアクセスするためにハッシュテーブルに単語を格納していますか? ... – bedwyr

答えて

2

どのように?多くの単語を格納するには数メガバイトのRAMが必要ですが、それ以外の場合はファイルに頻繁にアクセスしているので、おそらくキャッシュされます。単語リストをメモリに保存する利点は、ニーズに最も適したデータ構造(トライを考えています)で整理できることです。あまりにも多くのメモリを節約できない場合は、データベースを使用して、任意のクエリに必要な単語リストの部分だけを効率的に読み込むことができます。もちろん、その場合はSQLの索引機能を利用できるように、少なくとも1つの索引列を作成してください。

0

あなたの行っていることが、あなたのリストに単語が存在するかどうかを調べているとすれば、インデックス付きの列を持つSQLiteは、単語リストを直線的にスキャンするよりも速いと言えます。現在、あなたの現在のアプローチがあなたの目的にとって十分に速い場合、私はデータベースへの移植を気にする必要はありません。それは、あなたが懸念している限り、利益を得るための頭痛の種です。検索時間が負担になることがわかっている場合は、インデックス付きデータベースにダンプすることをお勧めします。

次のスキーマを持つテーブルを作成することができます。

CREATE TABLE words (
     word text primary key 
); 

CREATE INDEX word_idx ON words(word); 

とを使用してデータをインポートする:メモリにそれを維持について

sqlite words.db < schema.sql 
while read word 
do 
    sqlite3 words.db "INSERT INTO words values('$word');" 
done < words.txt 
0

上記の理由でデータベースをスキップします。メモリ内の単純なハッシュは、データベース内で高速に検索されます。

データベースがルックアップに少し速い場合でも、DBを使用してクエリを解析し、ルックアップの計画を作成してから結果を組み立ててプログラムに戻す時間が無駄です。さらに、自分自身を依存関係から救うことができます。

プログラムの他の部分を固定ストアに移動する予定がある場合は、移動してください。しかし、ハッシュマップで十分です。

+0

?データベースは、メモリ内のハッシュより少なくとも100倍遅くなるでしょう。しかし、ハッシュする必要はありません。リストを並べ替えるだけで、基数として最初の26文字から始まり、次にバイナリ検索を行います –

関連する問題