代码之家  ›  专栏  ›  技术社区  ›  Peer Allan

使用ActiveRecord验证旧表

  •  1
  • Peer Allan  · 技术社区  · 17 年前

    大家好,

    逐个验证检查仍然很慢,但SQL副本的速度增加远远弥补了这一点。然而,这并没有平息我们的渴望,看看我们是否能够更快地进行验证检查。我们试图将表拆分为块并将每个块传递给线程,但实际上执行速度较慢。

    Model.find_each do |m|
      logger.info "M #{m.id} is not valid" unless m.valid?
    end
    

    谢谢

    编辑 我要说的不是这段代码。我们正在寻找关于如何并行运行的建议,为每个进程提供一块数据,而不需要每个进程都有一台机器

    2 回复  |  直到 17 年前
        1
  •  0
  •   gtd    17 年前

    我喜欢zgchurch的回应作为起点。

    现在,如果你真的想加快速度,你应该看看实际的验证,找出一个更有效的方法来实现它们。在大多数验证情况下,加载所有行并实例化ActiveRecord对象往往会主导性能。您可能要花费90-99.99%的时间从内存中加载和卸载数据。

    在这种情况下,我倾向于使用原始SQL。您可以比原始ActiveRecord验证回调快数万倍来验证外键完整性。当然,这种方法的可行性取决于验证的实际细节。即使您需要比SQL更丰富的东西来定义有效性,您仍然可能获得10-100倍的速度提升,只需使用更薄的SQL接口加载最小的数据并直接检查数据即可。如果是这样,Perl或Python可能是更好的原始性能选择。