большие данные в массиве - PullRequest
2 голосов
/ 22 ноября 2011

Я занимаюсь разработкой приложения Rails .Я хотел бы использовать массив для хранения 2 000 000 данных , а затем вставить данные в базу данных следующим образом:

large_data = Get_data_Method() #get 2,000,000 raw data

all_values = Array.new

large_data.each{ |data|

    all_values << data[1] #e.g. data[1] has the format "(2,'john','2002-09-12')"

}

sql="INSERT INTO cars (id,name,date) VALUES "+all_values.join(',')

ActiveRecord::Base.connection.execute(sql)

Когда я запускаю код, это занимает много времени вточка large_data.each{...}.На самом деле, я все еще жду, пока он завершится (он работает в течение 1 часа, но все еще не завершает часть large_data.each{...}).

Из-за того, что количество элементов слишком велико для массива ruby, массив не может содержать 2 000 000 элементов?или массив ruby ​​может содержать столько элементов, и разумно ждать так долго?

Так как я хотел бы использовать массовая вставка в SQL, чтобы ускорить большое время вставки данных в базу данных mysql, поэтому я хотел бы использовать только одно выражение INSERT INTO, поэтому я сделал вышеупомянутое.Если это плохой дизайн, можете ли вы порекомендовать мне лучший способ?

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Некоторые заметки:

Не используйте шаблон «пустой массив + каждый + толчок», используйте Enumerable # map .

all_values = large_data.map { |data| data[1] }

Можно ли написать get_data, чтобы лениво возвращать вещи? если ответ «да», отметьте перечислители и используйте их для пакетной вставки в базу данных вместо размещения всех объектов одновременно. Примерно так:

def get_data
  Enumerator.new do |yielder|
    yielder.yield some_item
    yielder.yield another_item
    # yield all items.
  end
end

get_data.each_slice(1000) do |data|
  # insert those 1000 elements into the database
end

Тем не менее, есть проекты для выполнения эффективных массовых вставок, отметьте ar-extensions и activerecord-import для Rails> = 3.

1 голос
/ 22 ноября 2011

Массив из 2 млн. Элементов никогда не будет легким в управлении, если вы взглянули на MongoDB , это база данных, к которой можно обращаться точно так же, как к массиву, и она может быть ответом на ваши вопросы.

Легким решением было бы разделить вставки на блоки по 1000, что сделало бы весь процесс более управляемым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...