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 ., , , , .)