Эффективный для памяти и производительности способ поиска записей и заполнения таблицы - PullRequest
0 голосов
/ 17 мая 2011

Я работаю в среде Rails 2.3.11.

Я хочу заполнить таблицу social_activities следующим образом:

votes = Vote.find(:all, :limit => 10000, :order => 'created_at DESC')
for vote in votes do
  act = vote.activity_for!
  act.created_at = vote.created_at
  act.save!
end

comments = Comment.find(:all, :limit => 10000, :order => 'created_at DESC')
for comment in comments do
  act = comment.activity_for!
  act.created_at = comment.created_at
  act.save!
end

... и ... и так далее ...

Как видите, я обрабатываю много записей. Как я могу сделать это наиболее эффективным с точки зрения памяти и производительности способом?

Ответы [ 2 ]

0 голосов
/ 17 мая 2011

Вместо того, чтобы извлекать 10000 записей за раз, вы можете уменьшить количество объектов в памяти, уменьшив это число (скажем, 100), и используя find_each для прохождения всех записей.*

Теперь записи будут извлекаться только по 100 одновременно, что сокращает объем памяти.

0 голосов
/ 17 мая 2011

Active Record не подходит для импорта или перемещения больших наборов данных. Это похоже на то, что вы должны делать непосредственно с оператором SQL.

В SQL я думаю, что вы бы сделали это с обновлением внутреннего соединения или чем-то подобным. В любом случае сервер SQL будет выполнять ваш запрос напрямую, и это будет значительно быстрее, чем Active Record.

...