在Rails App中更新大量数据

时间:2012-02-13 17:37:39

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

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

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

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

这是我现在认为最好的过程:

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

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

  3. 将新创建的表重命名为rails app正在寻找的名称。

  4. 删除旧的。

  5. 所有这一切我都打算在生产服务器上做好。

    有更好的方法吗?

    评论中的其他说明:

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

2 个答案:

答案 0 :(得分: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;

将此作为一个命令使其立即(足够接近),因此几乎没有停机时间。我已经使用大型数据集完成了这项工作,并且重命名是“切换”,您应该保持正常运行时间。

答案 1 :(得分:1)

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

所以在Ruby on Rails框之外思考。

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