Creating Thousands of Rails Entries

Let me create a scene: my application deals with gift cards. When we create cards, they must have a unique line that the user can use to redeem it. Therefore, when someone orders our gift cards as a retailer, we need to make many new card objects and save them in the database.

With that in mind, I'm trying to figure out how quickly I can get my application to generate 100,000 cards. I’m not a database expert, so I need someone to explain this small phenomenon: when I create 1000 maps, it takes 5 seconds. When I create 100,000 cards, should it take 500 seconds?

Now I know what you want to see, the method of creating a map that I use, because the first assumption would be that it becomes slower, because it checks the uniqueness of many maps, especially as it goes. But I can show you my rake task

desc "Creates cards for a retailer"
task :order_cards, [:number_of_cards, :value, :retailer_name] => :environment do |t, args|
  t = Time.now
  puts "Searching for retailer"
  @retailer = Retailer.find_by_name(args[:retailer_name])
  puts "Retailer found"
  puts "Generating codes"
  value = args[:value].to_i
  number_of_cards = args[:number_of_cards].to_i
  codes = []
  top_off_codes(codes, number_of_cards)
  while codes != codes.uniq
    codes.uniq!
    top_off_codes(codes, number_of_cards)
  end
  stored_codes = Card.all.collect do |c|
    c.code
  end
  while codes != (codes - stored_codes)
    codes -= stored_codes
    top_off_codes(codes, number_of_cards)
  end
  puts "Codes are unique and generated"
  puts "Creating bundle"
  @bundle = @retailer.bundles.create!(:value => value)
  puts "Bundle created"
  puts "Creating cards"
  @bundle.transaction do
    codes.each do |code|
      @bundle.cards.create!(:code => code)
    end
  end
  puts "Cards generated in #{Time.now - t}s"
end

def top_off_codes(codes, intended_number)
  (intended_number - codes.size).times do
    codes << ReadableRandom.get(CODE_LENGTH)
  end
end

, readable_random . , , , , . , . . stackoverflow: , ? ? , , , . - - , 100 000 ?

( , , , , 100 000 , 5,5 ., , , , .)

+3
2

, , :

+2

- 100 000 , , , , .

?

?

, /.

Ruby - @bundle.transaction - ActiveModel , ?

+1
source

Source: https://habr.com/ru/post/1783807/


All Articles