рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдмрд╣реБрдкреНрд░рдЪрд╛рд░рд┐рдд рдФрд░ рд╕рд╛рдордВрдЬрд╕реНрдп

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░!

рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреА рд╡рд┐рд╡рд┐рдзрддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд▓рдХреНрд╖реНрдп рднрдВрдбрд╛рд░рдг рдореЗрдВ рд╕рддреНрдпрд╛рдкрд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдбреЗрдЯрд╛ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рдирджрдВрдб рд╣реИред

рдЗрд╕ рдЖрд╢рдп рдХреЗ рдХрдИ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдФрд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ, рдФрд░ рд╣рдо рд╕рд╛рдордВрдЬрд╕реНрдп рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХреЗ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдкрд╣рд▓реБрдУрдВ рдкрд░ рдпрд╣рд╛рдВ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереА ред рдореИрдВ рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рд╕реНрдХреЗрд▓реЗрдмрд▓ рдФрд░ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЛ рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рдкрд╛рдпрдерди рдкрд░ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП - рдЗрд╕реЗ рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдкрдврд╝реЗрдВ! рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ!


(рдЫрд╡рд┐ рд╕реНрд░реЛрдд)

рдкрд░рд┐рдЪрдп


рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдПрдХ рд╡рд┐рддреНрддреАрдп рд╕рдВрд╕реНрдерд╛рди рдореЗрдВ рдХрдИ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рдгрд╛рд▓рд┐рдпрд╛рдВ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдЗрди рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рд▓реЗрдирджреЗрди рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдФрд░ рдореЗрд▓ рдЦрд╛рддреЗ рдбреЗрдЯрд╛ рдХреЛ рд▓рдХреНрд╖реНрдп рднрдВрдбрд╛рд░рдг рдореЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИред

рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ, PostgreSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдмрдбрд╝реА рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдФрд░ рдПрдХ рдЯреЗрдмрд▓ рд▓реЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЗрди рд╕реНрд░реЛрддреЛрдВ рдХреЗ рдбреЗрдЯрд╛ рдореЗрдВ рд╕рдорд╛рди рд▓реЗрдирджреЗрди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдмреАрдЪ рдорддрднреЗрдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рднрдВрдбрд╛рд░рдг рдореЗрдВ рд╕рддреНрдпрд╛рдкрд┐рдд рдбреЗрдЯрд╛ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╣реА рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдХрдИ рд╕рд╛рдордВрдЬрд╕реНрдп рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рд▓реЙрдиреНрдЪ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдФрд░ рдорд▓реНрдЯреАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдорд▓реНрдЯреАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ рдкрд╛рдпрдерди рдореЗрдВ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдФрд░ рдПрдХ рдорд╛рдпрдиреЗ рдореЗрдВ, рдХреБрдЫ рдЬреАрдЖрдИрдПрд▓ рдЦрд╛рдорд┐рдпреЛрдВ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдиреАрдЪреЗ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рд╡рд┐рдХрд╛рд╕ рдХреЗ рддрд╣рдд рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░



рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдШрдЯрдХ:

  • рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдбреЗрдЯрд╛ рдЬрдирд░реЗрдЯрд░ - рдПрдХ рдкрд╛рдпрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛ рдПрдХ рд╕реАрдПрд╕рд╡реА рдлрд╝рд╛рдЗрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рднрд░рддреА рд╣реИ;
  • рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд - PostgreSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ CSV рдлрд╝рд╛рдЗрд▓ рдФрд░ рддрд╛рд▓рд┐рдХрд╛;
  • рдПрдбреЗрдкреНрдЯрд░ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рджреЛ рдПрдбреЗрдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЕрдкрдиреЗ рд╕реНрд░реЛрддреЛрдВ (рд╕реАрдПрд╕рд╡реА рдпрд╛ рдбреАрдмреА) рд╕реЗ рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓реЗрдВрдЧреЗ рдФрд░ рдордзреНрдпрд╡рд░реНрддреА рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджрд░реНрдЬ рдХрд░реЗрдВрдЧреЗ;
  • рдбреЗрдЯрд╛рдмреЗрд╕ - рддреАрди рдЯреБрдХрдбрд╝реЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ: рдХрдЪреНрдЪрд╛ рдбреЗрдЯрд╛, рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдбреЗрдЯрд╛рдмреЗрд╕ рдЬреЛ рдПрдбреЗрдкреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдХреИрдкреНрдЪрд░ рдХреА рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреЛрдиреЛрдВ рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдПрдХ "рдХреНрд▓реАрди" рдбреЗрдЯрд╛рдмреЗрд╕ рдЬрд┐рд╕рдореЗрдВ рд╕рд╛рдордВрдЬрд╕реНрдпрдкреВрд░реНрдг рд▓реЗрдирджреЗрди рд╣реЛрддрд╛ рд╣реИред

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг


рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░реЗрдЬ рдЯреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ PostgreSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЪрд▓ рд░рд╣реЗ pgAdmin рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░реЗрдВрдЧреЗ:

docker run --name pg -d -e "POSTGRES_USER=my_user" -e "POSTGRES_PASSWORD=my_password" postgres 

рдЪрд▓ рд░рд╣рд╛ рд╣реИ pgAdmin:

 docker run -p 80:80 -e "PGADMIN_DEFAULT_EMAIL=user@domain.com" -e "PGADMIN_DEFAULT_PASSWORD=12345" -d dpage/pgadmin4 

рд╕рдм рдХреБрдЫ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ (conf / db.ini) рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ (рдПрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред

 [POSTGRESQL] db_url=postgresql://my_user:my_password@172.17.0.2:5432/my_user 

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдПрдХ рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ рдФрд░ рдЖрдк рдЕрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрдирдкреБрдЯ рдЬрдирд░реЗрд╢рди


рдкрд╛рдпрдерди рд▓рд┐рдкрд┐ Gener_test_data рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЬреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рд▓реЗрддреА рд╣реИред GenerateTestData рд╡рд░реНрдЧ рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  @m.timing def run(self, num_rows): """ Run the process """ m.info('START!') self.create_db_schema() self.create_folder('data') self.create_csv_file(num_rows) self.bulk_copy_to_db() self.random_delete_rows() self.random_update_rows() m.info('END!') 

рдЗрд╕рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдирд┐рдореНрди рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ:

  • рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реНрдХреАрдорд╛ рдмрдирд╛рдирд╛ (рд╣рдо рд╕рднреА рдореБрдЦреНрдп рд╕реНрдХреАрдорд╛ рдФрд░ рдЯреЗрдмрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ);
  • рдПрдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдирд╛;
  • рджреА рдЧрдИ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛;
  • рд▓рдХреНрд╖реНрдп рддрд╛рд▓рд┐рдХрд╛ рд▓реЗрди-рджреЗрди_db_raw.transaction_log рдореЗрдВ рдмрд▓реНрдХ-рд╕рдореНрдорд┐рд▓рд┐рдд рдбреЗрдЯрд╛;
  • рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЖрдХрд╕реНрдорд┐рдХ рд╡рд┐рд▓реЛрдкрди;
  • рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЕрджреНрдпрддрдиред

рд╡рд┐рд▓реЛрдкрди рдФрд░ рд╕рдВрд╢реЛрдзрди рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рддреБрд▓рдирд╛ рдХреА рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╡рд┐рд╕рдВрдЧрддрд┐ рд╣реЛред рдЗрди рд╡рд┐рд╕рдВрдЧрддрд┐рдпреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ!

 @m.timing @m.wrapper(m.entering, m.exiting) def random_delete_rows(self): """ Random deleting some rows from the table """ sql_command = sql.SQL(""" delete from {0}.{1} where ctid = any(array( select ctid from {0}.{1} tablesample bernoulli (1) ))""").format(sql.Identifier(self.schema_raw), sql.Identifier(self.raw_table_name)) try: rows = self.database.execute(sql_command) m.info('Has been deleted [%s rows] from table %s' % (rows, self.raw_table_name)) except psycopg2.Error as err: m.error('Oops! Delete random rows has been FAILED. Reason: %s' % err.pgerror) @m.timing @m.wrapper(m.entering, m.exiting) def random_update_rows(self): """ Random update some rows from the table """ sql_command = sql.SQL(""" update {0}.{1} set transaction_amount = round(random()::numeric, 2) where ctid = any(array( select ctid from {0}.{1} tablesample bernoulli (1) ))""").format(sql.Identifier(self.schema_raw), sql.Identifier(self.raw_table_name)) try: rows = self.database.execute(sql_command) m.info('Has been updated [%s rows] from table %s' % (rows, self.raw_table_name)) except psycopg2.Error as err: m.error('Oops! Delete random rows has been FAILED. Reason: %s' % err.pgerror) 

рд╕реАрдПрд╕рд╡реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рдкрд╛рда рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рд╕реЗрдЯ рдФрд░ рдмрд╛рдж рдХреА рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреА рдкреАрдврд╝реА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

  • рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд▓реЗрдирджреЗрди рдпреВрдЖрдИрдбреА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ;
  • рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдпреВрдЖрдИрдбреА рдЦрд╛рддрд╛ рд╕рдВрдЦреНрдпрд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╣рдо рджрд╕ рдЕрджреНрд╡рд┐рддреАрдп рдЦрд╛рддреЗ рд▓реЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди "random_accounts" рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмрджрд▓рдХрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдорд╛рди рдХреЛ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ);
  • рд▓реЗрди-рджреЗрди рдХреА рддрд╛рд░реАрдЦ - рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ (initial_date) рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рддрд┐рдерд┐ рд╕реЗ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рддрд┐рдерд┐;
  • рд▓реЗрдирджреЗрди рдХрд╛ рдкреНрд░рдХрд╛рд░ (рд▓реЗрдирджреЗрди / рдХрдореАрд╢рди);
  • рд▓реЗрди-рджреЗрди рдХреА рд░рд╛рд╢рд┐;
  • рдбреЗрдЯрд╛ рдЬрдирд░реЗрд╢рди рдореЗрдВ рдореБрдЦреНрдп рдХрд╛рд░реНрдп TestDataCadoror рдХреА рдЬрдирд░реЗрдЯ_рдЯреИрд╕реНрдЯ_рдбрд╛рдЯрд╛_рдмрд╛рдИ_рдЪрдВрдХ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 @m.timing def generate_test_data_by_chunk(self, chunk_start, chunk_end): """ Generating and saving to the file """ num_rows_mp = chunk_end - chunk_start new_rows = [] for _ in range(num_rows_mp): transaction_uid = uuid.uuid4() account_uid = choice(self.list_acc) transaction_date = (self.get_random_date(self.date_in, 0) .__next__() .strftime('%Y-%m-%d %H:%M:%S')) type_deal = choice(self.list_type_deal) transaction_amount = randint(-1000, 1000) new_rows.append([transaction_uid, account_uid, transaction_date, type_deal, transaction_amount]) self.write_in_file(new_rows, chunk_start, chunk_end) 

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрдИ рд╕рдорд╛рдирд╛рдВрддрд░ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рд▓реЙрдиреНрдЪ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ 50K рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдЕрдкрдиреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдпрд╣ "рдЪрд┐рдк" рдЖрдкрдХреЛ рдХрдИ рдорд┐рд▓рд┐рдпрди рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬрд▓реНрджреА рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд

 def run_csv_writing(self): """ Writing the test data into csv file """ pool = mp.Pool(mp.cpu_count()) jobs = [] for chunk_start, chunk_end in self.divide_into_chunks(0, self.num_rows): jobs.append(pool.apply_async(self.generate_test_data_by_chunk, (chunk_start, chunk_end))) # wait for all jobs to finish for job in jobs: job.get() # clean up pool.close() pool.join() 

рдкрд╛рда рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдмрд▓реНрдХ_рдЗрдиреНрдЯрд░ рдХрдорд╛рдВрдб рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рднреА рдбреЗрдЯрд╛ рд▓реЗрдирджреЗрди_db_raw.transaction_log рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рджреЛ рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рдбреЗрдЯрд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╕рд╛рдордВрдЬрд╕реНрдп рдХреБрдЫ рднреА рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд▓рдЧреЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХрдИ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдПрдБ рдФрд░ 10K рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рд▓реЗрдирджреЗрди рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░реАрдХреНрд╖рдг CSV рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:

 ./generate_test_data.py 10000 


рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ 10K рд▓рд╛рдЗрдиреЛрдВ рдХреА рдПрдХ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рдкреНрдд рд╣реБрдИ рдереА, 10K рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ 112 рд▓рд╛рдЗрдиреЗрдВ рд╣рдЯрд╛ рджреА рдЧрдИрдВ рдФрд░ рдПрдХ рдЕрдиреНрдп 108 рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ред рдкрд░рд┐рдгрд╛рдо: рдлрд╝рд╛рдЗрд▓ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ 220 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИред

"рдареАрдХ рд╣реИ, рдмрд╣реБ рдХрд╣рд╛рдВ рд╣реИ?", рдЖрдк рдкреВрдЫрддреЗ рд╣реИрдВред
рдФрд░ рдЗрд╕рдХрд╛ рдХрд╛рдо рддрдм рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЖрдк 10K рд░рд┐рдХреЙрд░реНрдб рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 1M рд╕реЗ рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рд╣рдо рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ?

 ./generate_test_data.py 1000000 


рдбреЗрдЯрд╛ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ, рд╣рдЯрд╛рдиреЗ рдФрд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░рд┐рдХреЙрд░реНрдб рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЯреЗрдмрд▓ рд╕реЗ рдкрд╛рда рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрддрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ: 19,939 рдкрдВрдХреНрддрд┐рдпрд╛рдБ (рдЬрд┐рдирдореЗрдВ рд╕реЗ 10,022 рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛, рдФрд░ 9,917 рдмрджрд▓ рдЧрдП)ред

рдЪрд┐рддреНрд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрднрд┐рд▓реЗрдЦреЛрдВ рдХреА рдкреАрдврд╝реА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ, рдЕрд╕рдВрдЧрдд рдереАред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрдЯрд╛рд░реНрдЯ рдСрд░реНрдбрд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗ рдмрд┐рдирд╛ рд╢реБрд░реВ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреИрд╕реЗ рд╣реА рдкрд┐рдЫрд▓реЗ рдПрдХ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдмрд╛рдд рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдЗрдирдкреБрдЯ рдХреЗ рд╕рдорд╛рди рдХреНрд░рдо рдореЗрдВ рд╣реЛрдЧрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рддреЗрдЬ рд╣реИ?
рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдкрд░ рдПрдХ рдорд┐рд▓рд┐рдпрди рд▓рд╛рдЗрдиреЗрдВ 15.5 рд╕реЗрдХрдВрдб рдореЗрдВ "рдЖрд╡рд┐рд╖реНрдХрд╛рд░" рдирд╣реАрдВ рдХреА рдЧрдИрдВ - рдФрд░ рдпрд╣ рдПрдХ рдпреЛрдЧреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИред рдЕрдиреБрдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдкреАрдврд╝реА рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдорд▓реНрдЯреАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛, рдореБрдЭреЗ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рд╛: рдлрд╝рд╛рдЗрд▓ рдкреАрдврд╝реА рддреАрди рдЧреБрдирд╛ рд╕реЗ рдЕрдзрд┐рдХ рдзреАрдореА рдереА (15.5 рдХреЗ рдмрдЬрд╛рдп 52 рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ):



рд╕реАрдПрд╕рд╡реА рдХреЗ рд▓рд┐рдП рдПрдбрд╛рдкреНрдЯрд░


рдпрд╣ рдПрдбреЗрдкреНрдЯрд░ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рдХреЙрд▓рдо рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд▓реЗрди-рджреЗрди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рдбреЗрдЯрд╛ / transaction_hashed.csv рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрддрд╛ рд╣реИред рдЙрдирдХреЗ рдХрд╛рдо рдХрд╛ рдЕрдВрддрд┐рдо рдЪрд░рдг рдЗрд╕ рдлрд╛рдЗрд▓ рдХреЛ COPY рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдордВрдЬрд╕реНрдп_ db рд╕реНрдХреАрдорд╛ рдХреА рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд▓реЛрдб рдХрд░рдирд╛ рд╣реИ ред

рдЗрд╖реНрдЯрддрдо рдлрд╝рд╛рдЗрд▓ рд░реАрдбрд┐рдВрдЧ рдХрдИ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо 5 рдореЗрдЧрд╛рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ, рд▓рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЗрди рдкрдврд╝рддреЗ рд╣реИрдВред рдЖрдВрдХрдбрд╝рд╛ "5 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ" рдЕрдиреБрднрд╡рдЬрдиреНрдп рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рдЗрд╕ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдерд╛ рдХрд┐ рд╣рдо рдЕрдкрдиреА рдЖрднрд╛рд╕реА рдорд╢реАрди рдкрд░ рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рд╕рдордп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗред рдЖрдк рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдкрд░ рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рдордп рдХреИрд╕реЗ рдмрджрд▓реЗрдЧрд╛:

 @m.timing def process_wrapper(self, chunk_start, chunk_size): """ Read a particular chunk """ with open(self.file_name_raw, newline='\n') as file: file.seek(chunk_start) lines = file.read(chunk_size).splitlines() for line in lines: self.process(line) def chunkify(self, size=1024*1024*5): """ Return a new chunk """ with open(self.file_name_raw, 'rb') as file: chunk_end = file.tell() while True: chunk_start = chunk_end file.seek(size, 1) file.readline() chunk_end = file.tell() if chunk_end > self.file_end: chunk_end = self.file_end yield chunk_start, chunk_end - chunk_start break else: yield chunk_start, chunk_end - chunk_start @m.timing def run_reading(self): """ The main method for the reading """ # init objects pool = mp.Pool(mp.cpu_count()) jobs = [] m.info('Run csv reading...') # create jobs for chunk_start, chunk_size in self.chunkify(): jobs.append(pool.apply_async(self.process_wrapper, (chunk_start, chunk_size))) # wait for all jobs to finish for job in jobs: job.get() # clean up pool.close() pool.join() m.info('CSV file reading has been completed') 

1M рд░рд┐рдХреЙрд░реНрдб рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдкрдврд╝рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:


рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╡рд░реНрддрдорд╛рди рд╕рд╛рдордВрдЬрд╕реНрдп рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдЕрдЧрд▓рд╛ рднрд╛рдЧреЛрдВ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкрдврд╝рдирд╛ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХрд╛ рд╣реИрд╢ рд▓реЗрдирд╛ рд╣реИред рдПрдбреЗрдкреНрдЯрд░ рд╕реЗ рд▓рдХреНрд╖реНрдп рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рдЗрд╕ рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рд╕реБрд▓рд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реБрд▓рд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

PostgreSQL рдХреЗ рд▓рд┐рдП рдПрдбрд╛рдкреНрдЯрд░


рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдбрд╛рдкреНрдЯрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдбрд╛рдкреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рдЧрднрдЧ рдПрдХ рд╣реА рддрд░реНрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

  • рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдкрдврд╝рдирд╛ (рдпрджрд┐ рдпрд╣ рдмрдбрд╝реА рд╣реИ, 100K рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ) рдФрд░ рд▓реЗрдирджреЗрди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдХреЙрд▓рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИрд╢ рд▓реЗрдирд╛;
  • рддрдм рд╕рд╛рдордВрдЬрд╕реНрдп_db рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдбреЗрдЯрд╛ рдХрд╛ рд╕рдореНрдорд┐рд▓рди рд╣реЛрддрд╛ рд╣реИ ред рднрдВрдбрд╛рд░рдг _ $ (int (time.time ()) ред

рдЗрд╕ рдПрдбреЗрдкреНрдЯрд░ рдХреА рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдПрдХ рдкреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ред

рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рднреАрддрд░ 10 рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдПрдХ рд╡рд┐рднрд╛рдЬрди рд╣реЛрддрд╛ рд╣реИред

 def read_data(self): """ Read the data from the postgres and shared those records with each processor to perform their operation using threads """ threads_array = self.get_threads(0, self.max_id_num_row, self.pid_max) for pid in range(1, len(threads_array) + 1): m.info('Process %s' % pid) # Getting connection from the connection pool select_conn = self._select_conn_pool.getconn() select_conn.autocommit = 1 # Creating 10 process to perform the operation process = Process(target=self.process_data, args=(self.data_queque, pid, threads_array[pid-1][0], threads_array[pid-1][1], select_conn)) process.daemon = True process.start() process.join() select_conn.close() 


рд╡рд┐рд╕рдВрдЧрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬреЗрдВ


рд╣рдо рджреЛ рдПрдбреЗрдкреНрдЯрд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред

рд╕реБрд▓рд╣ (рдпрд╛ рдПрдХ рд╡рд┐рд╕рдВрдЧрддрд┐ рд░рд┐рдкреЛрд░реНрдЯ рдкреНрд░рд╛рдкреНрдд) рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдУрд░ рд╕реЗ SQL рднрд╛рд╖рд╛ рдХреА рд╕рднреА рд╢рдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реЛрддреА рд╣реИред

SQL рдХреНрд╡реЗрд░реА рдХрд╛рдлреА рд╕реАрдзреА рд╣реИ - рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдбрд╛рдкреНрдЯрд░реНрд╕ рд╕реЗ рдЯреНрд░рд╛рдВрдЬреЗрдХреНрд╢рди рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ:

 sql_command = sql.SQL(""" select s1.adapter_name, count(s1.transaction_uid) as tran_count from {0}.{1} s1 full join {0}.{1} s2 on s2.transaction_uid = s1.transaction_uid and s2.adapter_name != s1.adapter_name and s2.hash = s1.hash where s2.transaction_uid is null group by s1.adapter_name;""").format(sql.Identifier(self.schema_target), sql.Identifier(self.storage_table)) 

рдЖрдЙрдЯрдкреБрдЯ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рд╣реИ:


рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдКрдкрд░ рдХреА рддрд╕реНрд╡реАрд░ рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╣реИред рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ 9917 рд╣рдЯрд╛ рджрд┐рдП рдЧрдП рдереЗ рдФрд░ 10,022 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХреБрд▓ 19939 рд▓рд╛рдЗрдиреЗрдВ, рдЬреЛ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реИред

рд╕рд╛рд░рд╛рдВрд╢ рддрд╛рд▓рд┐рдХрд╛


рдпрд╣ рд╕реНрдЯреЛрд░реЗрдЬ рдЯреЗрдмрд▓ рдореЗрдВ "рдХреНрд▓реАрди" рдЯреНрд░рд╛рдВрдЬреИрдХреНрд╢рди рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реА рд░рд╣рддрд╛ рд╣реИ, рдЬреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдбреЗрдкреНрдЯрд░ рдореЗрдВ рд╕рднреА рддрд░рд╣ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рдореНрди SQL рдХреНрд╡реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИ:

 sql_command = sql.SQL(""" with reconcil_data as ( select s1.transaction_uid from {0}.{1} s1 join {0}.{1} s2 on s2.transaction_uid = s1.transaction_uid and s2.adapter_name != s1.adapter_name where s2.hash = s1.hash and s1.adapter_name = 'postresql_adapter' ) insert into {2}.transaction_log select t.transaction_uid, t.account_uid, t.transaction_date, t.type_deal, t.transaction_amount from {3}.transaction_log t join reconcil_data r on t.transaction_uid = r.transaction_uid where not exists ( select 1 from {2}.transaction_log tl where tl.transaction_uid = t.transaction_uid ) """).format(sql.Identifier(self.schema_target), sql.Identifier(self.storage_table), sql.Identifier(self.schema_db_clean), sql.Identifier(self.schema_raw)) 

рдЕрд╕реНрдерд╛рдпреА рддрд╛рд▓рд┐рдХрд╛ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдПрдбреЗрдкреНрдЯрд░ рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рдордзреНрдпрд╡рд░реНрддреА рднрдВрдбрд╛рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛, рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдирд┐рд╖реНрдХрд░реНрд╖


рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рдХреЗ рджреМрд░рд╛рди, рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рдореЗрдЯрдиреЗ рдХреА рдПрдХ рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рдХрд╕рд┐рдд рдХреА рдЧрдИ рдереА: рдПрдХ рдкрд╛рда рдлрд╝рд╛рдЗрд▓ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ред рдХрдо рд╕реЗ рдХрдо рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред

рд╢рд╛рдпрдж рдПрдХ рдкрд░рд┐рд╖реНрдХреГрдд рдкрд╛рдардХ рдпрд╣ рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рдЬреИрд╕реА рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд▓рдХрдбрд╝реА рдХреЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░, рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрд╛рдлреА рддреЗрдЬ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдмрдбрд╝реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдПред рд▓реЗрдХрд┐рди рдЗрд╕ рдХрд╛рдо рдХрд╛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рдирдВрдЧреЗ рдкрд╛рдЗрдерди рдореЗрдВ рдПрдХ рдкреНрд░рдгрд╛рд▓реА рд▓рд┐рдЦрдирд╛ рдФрд░ рдорд▓реНрдЯреАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╣рдордиреЗ рдЬреЛ рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕рдХреЗ рд╕рд╛рдеред

рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╕реЛрд░реНрд╕ рдХреЛрдб GitHub рдкрд░ рдореЗрд░реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ , рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░реЗрдВред

рдореБрдЭреЗ рд╕рднреА рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдФрд░ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

рдореИрдВ рдЖрдкрдХреЛ рд╕рдлрд▓рддрд╛ рдХреА рдХрд╛рдордирд╛ рдХрд░рддрд╛ рд╣реВрдВ!

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


All Articles