масса вставки монгоид - PullRequest
       13

масса вставки монгоид

2 голосов
/ 24 февраля 2011

У меня есть настоящее веб-приложение на Heroku, которое принимает обычный текст, состоящий в основном из значений, разделенных запятыми (или других значений, разделенных разделителями), которые пользователь копирует и вставляет в веб-форму, и приложение затем получает данные из каждой строки. и сохраните его в db монго.

например

45nm, 180, 3
44nm, 180, 3.5
45nm, 90, 7
...

@project = Project.first # project embeds_many :simulations
@array_of_array_of_data_from_csv.each do |line|
  @project.simulations.create(:thick => line[0], :ang => line[1], :pro => line[2])
  #e.g. line[0] => 45nm, line[1] => 180, line[2] => 3
end

Для целей этого приложения я не могу позволить пользователю выполнять какие-либо операции импорта, мы должны получать от них данные из текстовой области. И каждый раз пользователь может вставить до 30 000 строк. Я попытался сделать это (30 000 точек данных) на Heroku с некоторыми поддельными данными в консоли, он закончился, сказав, что длинные процессы не поддерживаются в консоли, вместо этого попробуйте выполнить грабли.

Так что мне было интересно, знает ли кто-нибудь, как так долго вставлять 30 000 документов (конечно, может быть, так оно и есть), или знает другой способ быстрой вставки 30 000 документов?

Спасибо за вашу помощь

1 Ответ

1 голос
/ 24 февраля 2011

Если вы вставляете столько документов, вы должны делать это как пакет ... Я обычно вставляю 200 000 пакетов документов, и они создаются в одно мгновение!

Таким образом, вместо создания цикла, который «создает» / вставляет новый документ каждый раз, просто сделайте так, чтобы ваш цикл добавлял массив документов, а затем вставлял его в MongoDB как один большой пакет.

Пример того, как это сделать с помощью монгоида, можно найти в этом вопросе .

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

Только будь осторожен:)

...