2010-12-16 105 views
1

我很難在Ruby on Rails應用程序中管理大型數據集的存儲和訪問。以下是我的應用程序:我正在執行Dijkstra的算法,因爲它涉及道路網絡,然後使用google maps API顯示它訪問的節點。我正在使用US road network的開放數據集通過迭代鏈接中給出的兩個txt文件來構建圖形,但是我在將這些數據存儲在我的應用程序中時遇到了問題。Ruby on Rails - 存儲和訪問大型數據集

我的印象是,像這樣的大數據集不是ActiveRecord對象 - 我不需要修改這些數據的內容,而是能夠訪問它並在本地緩存哈希以執行ruby方法在上面。我嘗試了一些東西,但我遇到了麻煩。

  1. 我認爲解析txt文件並以yml格式存儲圖表是最有意義的。然後,我可以將圖加載到數據庫中作爲種子數據,然後使用Node.all抓取圖,或者沿着這些線抓住圖。不幸的是,yml文件變得太大,無法處理。運行Rake會導致系統在無限遠處運行在100%...

  2. 接下來我想,既然我不需要修改數據,我可以在每次應用程序加載時都創建圖形作爲開始其「初始化」。但是我不知道該把代碼放在哪裏,我需要運行一些方法或者至少一塊數據。然後將它存儲在我可以在所有控制器/方法中訪問的某種全局/會話變量中。我不想傳遞這個龐大的數據集,只需從任何地方訪問它。

  3. 這是我目前正在做的方式,但它是不可接受的。我解析了在控制器動作中創建圖形的文本文件,並希望在服務器超時之前獲取計算。

理想情況下,我會將圖存儲在一個數據庫中,我可以抓取整個內容以便在本地使用。或者至少只需要在應用程序加載時解析數據一次,然後我就可以從不同的頁面查看等來訪問它。我覺得這將是最有效的,但我遇到了障礙時刻。

任何想法?

回答

0

你在正確的道路上。有幾種方法可以做到這一點。其一是,在你的模型類,之外的任何方法,建立了這樣的例子常量:

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' 

這些將在生產應用得到執行一次:加載模型的類時。另一種選擇:在初始化程序或其他配置文件中進行初始化。看到config/initializers目錄。