1

我很难在 Ruby on Rails 应用程序中管理大型数据集的存储和访问。简而言之,这是我的应用程序:我正在执行与道路网络有关的 Dijkstra 算法,然后使用 google maps API 显示它访问的节点。我正在使用美国道路网络的开放数据集通过迭代链接中给出的两个 txt 文件来构建图形,但是我无法在我的应用程序中存储这些数据。

我的印象是像这样的大型数据集不是 ActiveRecord 对象 - 我不需要修改这些数据的内容,而是能够访问它并将其缓存在本地哈希中以对其执行 ruby​​ 方法。我已经尝试了一些事情,但我遇到了麻烦。

  1. 我认为解析 txt 文件并将图形以 yml 格式存储是最有意义的。然后,我可以将图形作为种子数据加载到数据库中,并使用 Node.all 或类似的东西来获取图形。不幸的是,yml 文件变得太大,rails 无法处理。运行 Rake 会导致系统以 100% 无限运行...

  2. 接下来我想,既然我不需要修改数据,我可以在每次应用程序加载时创建图表作为其“初始化”的开始。但是我不知道该把这段代码放在哪里,我需要运行一些方法,或者至少是一个数据块。然后将其存储在某种全局/会话变量中,我可以在所有控制器/方法中访问该变量。我不想传递这个大型数据集,只需从任何地方访问它。

  3. 这是我目前正在这样做的方式,但这是不可接受的。我正在解析在控制器操作上创建图形的文本文件,并希望它在服务器超时之前得到计算。

理想情况下,我会将图形存储在数据库中,我可以获取整个内容以在本地使用。或者至少只需要在应用程序加载时解析一次数据,然后我就可以从不同的页面视图等访问它。我觉得这将是最有效的,但我遇到了障碍片刻。

有任何想法吗?

4

1 回答 1

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 目录。

于 2010-12-16T02:12:20.380 回答