ruby-on-rails - 在 Rails App 中更新大量数据

标签 ruby-on-rails database ruby-on-rails-3 postgresql

我有一个 Rails 应用程序,其中有一个大约 3000 万行的表,该表是我根据数据提供商每季度提供给我的文本文档构建的。从那里我进行一些操作并与其他一些表进行比较,并创建一个包含更多自定义数据的附加表。

我第一次这样做,我通过 Rails 控制台运行了 ruby​​ 脚本。这很慢,而且显然不是最好的方法。

简化此流程并在我的生产服务器上更新它而无需任何停机时间或至少非常有限的停机时间的最佳方法是什么?

这是我认为目前最好的过程:

  1. 创建 rake 任务来读取数据。使用 activerecord-import 插件进行批量写入并关闭 activerecord 验证。将此数据加载到全新的重复表中。

  2. 在新创建的表上构建索引。

  3. 将新创建的表重命名为 Rails 应用正在查找的名称。

  4. 删除旧的。

所有这些我都计划在生产服务器上完成。

有更好的方法吗?

评论中的其他注释:

  • 表已存在
  • 旧表和数据是一次性的
  • 表格只能锁定以供选择
  • 必须尽量减少停机时间
  • 我们当前的服务器情况是 2 个高 CPU Amazon EC2 实例。我相信它们有 1.7GB 的 RAM,因此暂时存储整个导入可能不是一个选择。
  • 新数据是原始文本文件,以行分隔。我已经用 Ruby 编写了用于解析它的脚本。

最佳答案

1) 创建“my_table_new”作为“my_table”的空克隆 2) 将文件(以 x 行的批处理)导入到 my_new_table - 随您使用而构建的索引。 3)运行:RENAME TABLE my_table TO my_table_old, my_table_new TO my_table;

将其作为一个命令执行可以使其即时(足够接近),因此几乎没有停机时间。我已经用大型数据集完成了此操作,并且由于其重命名,因此您应该保留正常运行时间的“开关”。

关于ruby-on-rails - 在 Rails App 中更新大量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9265166/

相关文章:

ruby-on-rails - Ruport - `each' :String 的未定义方法 ""

database - 从类图创建对象关系模式

sql - 从噪声字符串中提取电话号码

ruby-on-rails - 如何验证包含时区?

ruby-on-rails - 检查500页和404页的测试用例

ruby-on-rails - 未知操作 没有操作响应显示

ruby-on-rails - 在另一个域上使用 RESTful Web 服务的正确 "Rails Way"是什么?

mysql - 设置 MySQL 表的最有效方法?

ruby-on-rails-3 - 如何替换 Rspec 的 ENV ["RAILS_ENV"] ||= 'test' 在 Rails 3.0 中已弃用?

ruby - Rails 3 模型记录器