【问题标题】:Updating large amounts of data in Rails App在 Rails 应用程序中更新大量数据
【发布时间】:2012-02-13 17:37:38
【问题描述】:

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

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

在我的生产服务器上简化此过程并在没有任何停机时间或至少非常有限的停机时间的情况下对其进行更新的最佳方法是什么?

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

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

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

  3. 将新创建的表重命名为 rails 应用程序正在寻找的名称。

  4. 删除旧的。

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

有没有更好的方法来做到这一点?

来自 cmets 的其他说明:

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

【问题讨论】:

  • 使用 resque 或延迟作业的后台任务运行导入可能会起作用,您是急于让它们进入,还是只是不希望您的服务器在运行时变慢。
  • 有点着急。我更关心的是想出最轻松、最自动化的流程来完成这项工作,因为从现在到永远,我必须每 3 个月做一次。
  • 可能的路线取决于您的具体要求。您需要的表是否已经存在?结构会改变吗?您需要表中的旧数据吗?新数据是否完全替换了表的旧内容?你可以独占锁定桌子吗?您需要尽量减少停机时间吗?您是否有足够的 RAM 来临时保存全部导入的数据?
  • 最后但同样重要的是:您以什么格式获取新数据? CSV?
  • 查看编辑以获取问题的答案,欧文。

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


【解决方案1】:

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;

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

【讨论】:

  • 如果你有任何表/行锁 goig 将失败,我们在运行时关闭了所有工作人员,然后将它们重新启动。如果服务器正在锁定,那么只需找到它不忙的时间并执行直到它通过
【解决方案2】:

根据您的逻辑,我会认真考虑使用 SQL 处理数据库中的数据。这与数据很接近,并且通常不希望从数据库中提取 30m 行并与您也从数据库中提取的其他数据进行比较。

所以要跳出 Ruby on Rails 的框框思考。

SQL 具有内置的数据连接和比较数据以及插入和更新表的能力,这些能力非常强大和快速,可以在接近数据的情况下处理数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-06
    • 2015-01-18
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多