1

Ruby on Rails アプリケーション内で大規模なデータセットのストレージとアクセスを管理するのに苦労しています。ここに私のアプリケーションを簡単に示します。道路網に関連するダイクストラのアルゴリズムを実行し、Google マップ API を使用して訪問するノードを表示しています。米国の道路網のオープン データセットを使用して、リンクで指定された 2 つの txt ファイルを反復処理してグラフを作成していますが、このデータをアプリに保存するのに問題があります。

このような大規模なデータセットは ActiveRecord オブジェクトではないという印象を受けています。このデータの内容を変更する必要はありません。むしろ、データにアクセスしてハッシュでローカルにキャッシュし、それに対して ruby​​ メソッドを実行できます。私はいくつかのことを試しましたが、問題が発生しています。

  1. txt ファイルを解析し、グラフを yml 形式で保存するのが最も理にかなっていると考えました。その後、グラフをシード データとして DB にロードし、Node.all などを使用してグラフを取得できます。残念ながら、yml ファイルが大きすぎて Rails が処理できなくなります。Rake を実行すると、システムは無限に 100% で実行されます...

  2. 次に考えたのは、データを変更する必要がないので、「初期化」の開始時にアプリケーションがロードされるたびにグラフを作成するだけでよいということです。しかし、このコードをどこに置くべきか正確にはわかりません。いくつかのメソッドを実行するか、少なくともデータのブロックを実行する必要があります。そして、すべてのコントローラー/メソッドでアクセスできるある種のグローバル/セッション変数に保存します。この大規模なデータセットを渡したくはありません。どこからでもアクセスできるようにするだけです。

  3. これは私が現在行っている方法ですが、受け入れられません。コントローラー アクションでグラフを作成するテキスト ファイルを解析しており、サーバーがタイムアウトする前に計算できるようになることを期待しています。

理想的には、コンテンツ全体を取得してローカルで使用できるデータベースにグラフを保存します。または、少なくともアプリケーションのロード時にデータの解析が 1 回必要なだけで、その後、さまざまなページ ビューなどからアクセスできるようになります。これが最も効率的だと思いますが、一瞬。

何か案は?

4

1 に答える 1

0

あなたは正しい道を進んでいます。これを行うにはいくつかの方法があります。1つは、モデルクラスで、メソッドの外部で、次の例のような定数を設定することです。

MY_MAP = Hash[ActiveRecord::Base.connection.select_all('SELECT thingone, thingtwo from table').map{|one| [one['thingone'], one['thingtwo']]}]
RAW_DATA = `cat the_file`  # However you read and parse your file
CA = State.find_by_name 'California'
NY = State.find_by_name 'New York'

これらは、モデルのクラスが読み込まれるときに、本番アプリで1回実行されます。別のオプション:初期化子または他の構成ファイルでこの初期化を実行します。config/initializersディレクトリを参照してください。

于 2010-12-16T02:12:20.380 に答える