javascript - Ruby on Rails - 存储和访问大型数据集

标签 javascript ruby-on-rails ruby large-data

我很难在 Ruby on Rails 应用程序中管理大型数据集的存储和访问。简而言之,这是我的应用程序:我正在执行与道路网络相关的 Dijkstra 算法,然后使用谷歌地图 API 显示它访问的节点。我正在使用 US road network 的开放数据集通过迭代链接中给出的两个 txt 文件来构建图表,但我在将此数据存储在我的应用程序中时遇到问题。

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

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

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

  3. 这就是我目前正在做的方式,但这是 Not Acceptable 。我正在解析在 Controller 操作上创建图形的文本文件,并希望它在服务器超时之前得到计算。

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

有什么想法吗?

最佳答案

你走在正确的道路上。有几种方法可以做到这一点。一是在您的模型类中,在任何方法之外,设置如下示例所示的常量:

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

关于javascript - Ruby on Rails - 存储和访问大型数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4456834/

相关文章:

javascript - 显示图像而不是源 - bootstrap 多选插件

ruby-on-rails - Rails 4 为 API 操作跳过protect_from_forgery

ruby-on-rails - 在我的数据库中存储用户的Facebook friend 列表的最佳方法是什么?

ruby - 为什么 `a (b.c do;end)` 不是句法正确的 Ruby 程序?

javascript - 如何在组件中显示 Observables?

javascript - 使用 data.join 方法的 5 列 Google 图表

jquery - will_paginate + jquery ui 选项卡

ruby-on-rails - 规范在本地通过,但 Travis CI 失败

ruby - 构建 Bigcommerce 应用程序,我收到无效请求 : Invalid HTTP format, 解析失败

javascript - Ctrl + Enter 在 TEXTAREA 中使用 jQuery