我很难在Ruby on Rails应用程序中管理大型数据集的存储和访问。以下是我的应用程序:我正在执行Dijkstra算法,因为它与道路网络有关,然后使用google maps API显示它访问的节点。我正在使用US road network的开放数据集来通过迭代链接中给出的两个txt文件来构建图形,但是我在将这些数据存储到我的应用程序时遇到了问题。
我的印象是像这样的大型数据集不是ActiveRecord对象 - 我不需要修改此数据的内容,而是能够访问它并在哈希本地缓存它以执行ruby方法它。我尝试了一些事情,但我遇到了麻烦。
我认为解析txt文件并以yml格式存储图形是最有意义的。然后,我可以将图形作为种子数据加载到数据库中,并使用Node.all或这些行中的某些内容来获取图形。不幸的是,yml文件对于rails来说太大了。运行Rake会导致系统以无限的100%运行...
接下来我想,因为我不需要修改数据,所以每次应用程序加载时都可以创建图形作为“初始化”的开始。但是我不知道在哪里放这个代码,我需要运行一些方法,或者至少是一块数据。然后将它存储在某种全局/会话变量中,我可以在所有控制器/方法中访问它。我不想传递这个大型数据集,只需从任何地方访问它。
这是我目前的做法,但这是不可接受的。我正在解析在控制器操作上创建图形的文本文件,并希望它在服务器超时之前进行计算。
理想情况下,我会将图形存储在一个数据库中,我可以抓取整个内容以便在本地使用。或者至少只需要在应用程序加载时解析数据一次,然后我就可以从不同的页面视图等访问它。我觉得这将是最有效的,但我遇到了障碍时刻。
有什么想法吗?
答案 0 :(得分: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目录。