2013-08-01 34 views
0

我有一个CSV文件,其中包含数据,如 用户ID,单位和大小。如何优化获取并更新500000记录的ID?

我想更新member_id为500,000种产品:

500000.times do |i| 
    user = User.find(id: tmp[i]) 

    hash = { 
    unit: tmp[UNIT], 
    size: tmp[SIZE] 
    } 
    hash.merge!(user_id: user.id) if user.present? 

    Product.create(hash) 
end 

如何优化该过程没有找到每个用户对象,但可能得到相关的哈希值的阵列?

回答

4

这里有两件事是大量阻碍表现。首先,您正在进行完全失控的N User.find调用。其次,您要创建单个记录,而不是进行批量插入,每个记录都在自己的小事务块中运行。

通常,这些批量操作最好是纯粹在SQL域中完成。您可以同时插入大量的行,通常仅受限于您可以提交的查询的大小,并且该参数通常可以调整。

虽然巨大的查询可能会锁定或阻止您的数据库一段时间,但这将是执行更新的最快方式。如果您需要在批量插入期间保持系统运行,则需要将其分解为一系列较小的提交。

请记住,Product.connection是一个更低级别的访问层,允许您直接使用查询处理数据。

+0

+1用于表示在SQL中执行此操作。通过将数据保存在DBM中,这将是移动数据的最快方式。 –

+0

是的,我想用SQL来做,但我不确定这是否可能我在这里准备了另一个问题:http://stackoverflow.com/questions/18100547/how-should-i-import-this - 数据 - 到 - 我的数据库 – tomekfranek