2010-12-16 106 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目录。