require 'fastercsv' require 'xampl_generated_code/RandomPeople' require 'people' require 'settings' module RandomPeople class BatchLoadUsers attr_accessor :random_names, :created_addresses, :shared_addresses def load_names(iter) inner_start = Time.now commit_total = 0 commit_start = 0 base = (1 + iter) * self.random_names.size random_names.each_with_index do | row, i | Xampl.transaction("random-people") do person_pid = "person-#{ base + i }" person = Person.new(person_pid) person.given_name = row[0] person.surname = row[1] person.email = row[6] person.phone = row[7] addresses = Address.find_by_query do | q | q.add_condition('street-address', :equals, row[2]) q.add_condition('postal-code', :equals, row[5]) end address = addresses.first if address then person << address self.shared_addresses += 1 else address = person.new_address("address-#{ person_pid }") address.street_address = row[2] address.city = row[3] address.state = row[4] address.postal_code = row[5] self.created_addresses += 1 end commit_start = Time.now end commit_total += (Time.now - commit_start) puts "total: #{ commit_total }, iter: #{ i } --> #{ i / commit_total }/s" if 0 == (i % 1000) end done_at = Time.now total_time = done_at - inner_start puts "iter: #{ iter } in total: #{ total_time }, insert: #{ total_time - commit_total }, commit: #{ commit_total }" end def run start_at = Time.now self.random_names = FasterCSV.read("random-names.csv") parsed_at = Time.now base = 0 self.created_addresses = 0 self.shared_addresses = 0 10.times do | iter | load_names(iter) end processed_at = Time.now puts "parsed in #{ parsed_at - start_at }, processed in: #{ processed_at - parsed_at }" puts " created addresses: #{ created_addresses }, shared: #{ shared_addresses }" end end BatchLoadUsers.new.run end