Procesando Millones de Imágenes Ruby vs Elixir
-
Upload
gustavo-luis-condoy-pogo -
Category
Documents
-
view
219 -
download
0
Transcript of Procesando Millones de Imágenes Ruby vs Elixir
![Page 1: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/1.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 1/75
Procesando millones de
imágenesDavid Padilla
@dabit
![Page 2: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/2.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 2/75
Carrierwave
![Page 3: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/3.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 3/75
![Page 4: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/4.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 4/75
![Page 5: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/5.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 5/75
![Page 6: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/6.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 6/75
image.recreate_versions!
![Page 7: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/7.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 7/75
Image.each do |i| i.file.recreate_versions!end
![Page 8: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/8.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 8/75
2,700,000
![Page 9: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/9.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 9/75
1 segundo
![Page 10: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/10.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 10/75
2,700,000 ÷ 60
=
45,000 minutos
![Page 11: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/11.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 11/75
45,000 ÷ 60
=
750 horas
![Page 12: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/12.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 12/75
750 ÷ 24
=
31.25 días
![Page 13: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/13.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 13/75
MAX_WORKERS = 20
Image.find_each(batch_size: 1200) do |batch| queue = Queue.new batch.each {|o| queue.push o} workers = (0..MAX_WORKERS).map do | w|
Thread.new do while image = queue.pop(true) image.file.recreate_versions! end end
end
workers.map(&:join)end
![Page 14: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/14.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 14/75
MAX_WORKERS = 20
Image.find_each(batch_size: 1200) do |batch| queue = Queue.new batch.each {|o| queue.push o} workers = (0..MAX_WORKERS).map do |w|
Thread.new do while image = queue.pop(true) image.file.recreate_versions! end end
end
workers.map(&:join)end
![Page 15: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/15.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 15/75
MAX_WORKERS = 20
Image.find_each(batch_size: 1200) do |batch| queue = Queue.new batch.each {|o| queue.push o} workers = (0..MAX_WORKERS).map do |w|
Thread.new do while image = queue.pop(true) image.file.recreate_versions! end end
end
workers.map(&:join)end
![Page 16: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/16.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 16/75
MAX_WORKERS = 20
Image.find_each(batch_size: 1200) do |batch| queue = Queue.new batch.each {|o| queue.push o} workers = (0..MAX_WORKERS).map do |w|
Thread.new do while image = queue.pop(true) image.file.recreate_versions! end end
end
workers.map(&:join)end
![Page 17: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/17.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 17/75
MAX_WORKERS = 20
Image.find_each(batch_size: 1200) do |batch| queue = Queue.new batch.each {|o| queue.push o} workers = (0..MAX_WORKERS).map do | w|
Thread.new do while image = queue.pop(true) image.file.recreate_versions! end end
end
workers.map(&:join)end
![Page 18: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/18.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 18/75
![Page 19: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/19.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 19/75
array = []
5.times.map do Thread.new do 1000.times do array << nil end end
end.each(&:join)
puts array.size
![Page 20: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/20.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 20/75
$ ruby pushing_nil.rb5000
$ jruby pushing_nil.rb4446
$ rbx pushing_nil.rb3088
![Page 21: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/21.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 21/75
array = []
5.times.map do Thread.new do 1000.times do array << nil end end
end.each(&:join)
puts array.size
![Page 22: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/22.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 22/75
1 segundo
![Page 23: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/23.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 23/75
0.6 segundos
![Page 24: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/24.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 24/75
18 días
![Page 25: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/25.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 25/75
Elixir
![Page 26: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/26.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 26/75
class Code def method(*args) code = code + code
while(true) do something_awesome end end
def something_awesome add = 1 + 2 o = Object.new o.save_to_database endend
![Page 27: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/27.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 27/75
Exception
![Page 28: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/28.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 28/75
![Page 29: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/29.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 29/75
![Page 30: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/30.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 30/75
![Page 31: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/31.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 31/75
![Page 32: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/32.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 32/75
![Page 33: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/33.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 33/75
Traer registros de la Base de Datos
Bajar de S3 imagen original
Crear dos tamaños
Subir a S3
Crear aplicación
![Page 34: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/34.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 34/75
Crear aplicación
![Page 35: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/35.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 35/75
$ mix new images
![Page 36: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/36.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 36/75
![Page 37: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/37.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 37/75
Traer registros de la Basede Datos
![Page 38: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/38.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 38/75
use Mix.Config
config :images, Images.Repo,
adapter: Ecto. Adapters. MySQL, database: "images_database", username: "root", password: "",
hostname: "localhost"
![Page 39: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/39.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 39/75
defmodule Images.PropertyImage do use Ecto. Model
schema "images" do field :file, :string end
end
![Page 40: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/40.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 40/75
defmodule Images.Image do use Ecto. Model
def main_query do
from i in Images.Image, select: i end def find(image_id ) do
from i in main_query
where: id = ^image_id end
def paged(offset, limit) do from i in main_query, limit: ^limit,
offset: ^offset end def all do
Images.Repo.all main_query end
end
![Page 41: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/41.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 41/75
Bajar de S3 la imagenoriginal
![Page 42: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/42.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 42/75
def download_original(filename , id ) do file = temp_filename(filename, id) ibrowse = [save_response_to_file: String.to_char_list(file)] s3_url(filename, id)
|> HTTPotion.get([ibrowse: ibrowse]) fileend
def s3_url(file , id ) do "#{s3_path}/#{id}/#{file}"end
![Page 43: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/43.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 43/75
def download_original(filename , id ) do file = temp_filename(filename, id) ibrowse = [save_response_to_file: String.to_char_list(file)] s3_url(filename, id)
|> HTTPotion.get([ibrowse: ibrowse]) fileend
def s3_url(file , id ) do "#{s3_path}/#{id}/#{file}"end
![Page 44: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/44.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 44/75
def download_original(filename , id ) do file = temp_filename(filename, id) ibrowse = [save_response_to_file: String.to_char_list(file)]HTTPotion.get(s3_url(filename, id), [ibrowse: ibrowse])
fileend
def s3_url(file , id ) do "#{s3_path}/#{id}/#{file}"end
![Page 45: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/45.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 45/75
def download_original(filename , id ) do file = temp_filename(filename, id) ibrowse = [save_response_to_file: String.to_char_list(file)] s3_url(filename, id)
|> HTTPotion.get([ibrowse: ibrowse]) fileend
def s3_url(file , id ) do "#{s3_path}/#{id}/#{file}"end
![Page 46: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/46.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 46/75
Crear dos tamaños
![Page 47: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/47.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 47/75
![Page 48: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/48.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 48/75
def generate_medium (file , filename , id ) do result = Path.join(System .tmp_dir, size_name(filename, :medium ))
Mogrify.open(file) |> Mogrify.copy |> Mogrify.resize_to_fill("450x300") |> Mogrify.save(result)end
![Page 49: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/49.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 49/75
![Page 50: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/50.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 50/75
Subir a S3
![Page 51: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/51.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 51/75
![Page 52: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/52.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 52/75
{status, _} = System .cmd("s3cmd", ["-P", "put", filename, s3_name])
![Page 53: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/53.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 53/75
![Page 54: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/54.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 54/75
![Page 55: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/55.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 55/75
![Page 56: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/56.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 56/75
{_, file} = File.read(result)
Application.get_env(:images, :s3_bucket) |> String.to_char_list |> :erlcloud_s3.put_object(s3_name, file, [], [{#…}])
![Page 57: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/57.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 57/75
y la concurrencia?
![Page 58: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/58.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 58/75
Traer registros de la Base de Datos
Bajar de S3 imagen original
Crear dos tamaños
Subir a S3
![Page 59: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/59.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 59/75
:poolboy
![Page 60: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/60.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 60/75
![Page 61: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/61.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 61/75
defmodule Images.PropertyImageWorker do use GenServer
def start_link([]) do :gen_server.start_link( __MODULE__ , [], []) end
def init(state ) do secret = to_char_list( Application.get_env(:images, :aws_secret_key))
Application.get_env(:images, :aws_access_key) |> to_char_list |> :erlcloud_s3.configure(secret) {:ok, state} end
def handle_call(image , from , state ) do
result = Images.PropertyImage.process(image) {:reply, [result], state} endend
![Page 62: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/62.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 62/75
defmodule Images.PropertyImageWorker do use GenServer
def start_link([]) do :gen_server.start_link(__MODULE__, [], []) end
def init(state ) do secret = to_char_list( Application.get_env(:images, :aws_secret_key))
Application.get_env(:images, :aws_access_key) |> to_char_list |> :erlcloud_s3.configure(secret) {:ok, state} end
def handle_call(image , from , state ) do
result = Images.PropertyImage.process(image) {:reply, [result], state} endend
![Page 63: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/63.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 63/75
defmodule Images.ImagesSupervisor do use Supervisor
def start_link do :supervisor.start_link( __MODULE__ , [])
end
def init([]) do poolboy_config = [ {:name, {:local, pool_name()}}, {:worker_module, Images.PropertyImageWorker}, {:size, 20}, {:max_overflow , 0} ]
children = [ :poolboy.child_spec(pool_name(), poolboy_config, []), worker(Images.Repo, []) ]
supervise(children, strategy: :one_for_one) end
def pool_name do :property_images endend
![Page 64: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/64.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 64/75
defmodule Images.ImagesSupervisor do use Supervisor
def start_link do :supervisor.start_link(__MODULE__, [])
end
def init([]) do poolboy_config = [ {:name, {:local, pool_name()}}, {:worker_module, Images.PropertyImageWorker}, {:size, 20}, {:max_overflow , 0} ]
children = [ :poolboy.child_spec(pool_name(), poolboy_config, []), worker(Images.Repo, []) ]
supervise(children, strategy: :one_for_one) end
def pool_name do :property_images endend
![Page 65: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/65.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 65/75
defmodule Images do def start( _type , _args) do
supervisor = Images.ImagesSupervisor.start_link enqueue supervisor end
def enqueue do Images.PropertyImage.all
|> Enum .each fn(r ) -> spawn(fn() -> pool_image(r) end) end end
def pool_image(image ) do :poolboy.transaction( Images.ImagesSupervisor.pool_name, fn( pid ) -> :gen_server.call(pid, image) end,
:infinity ) endend
![Page 66: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/66.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 66/75
defmodule Images do def start( _type , _args) do
supervisor = Images.ImagesSupervisor.start_link enqueue supervisor end
def enqueue do Images.PropertyImage.all
|> Enum .each fn(r ) -> spawn(fn() -> pool_image(r) end) end end
def pool_image(image ) do :poolboy.transaction( Images.ImagesSupervisor.pool_name, fn( pid ) -> :gen_server.call(pid, image) end,
:infinity ) endend
![Page 67: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/67.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 67/75
defmodule Images do def start( _type , _args) do
supervisor = Images.ImagesSupervisor.start_link enqueue supervisor end
def enqueue do Images.PropertyImage.all
|> Enum .each fn(r ) -> spawn(fn() -> pool_image(r) end) end end
def pool_image(image ) do :poolboy.transaction( Images.ImagesSupervisor.pool_name, fn( pid ) -> :gen_server.call(pid, image) end,
:infinity ) endend
![Page 68: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/68.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 68/75
defmodule Images do def start( _type , _args) do
supervisor = Images.ImagesSupervisor.start_link enqueue supervisor end
def enqueue do Images.PropertyImage.all
|> Enum .each fn(r ) -> spawn(fn() -> pool_image(r) end) end end
def pool_image(image ) do :poolboy.transaction( Images.ImagesSupervisor.pool_name, fn( pid ) -> :gen_server.call(pid, image) end,
:infinity ) endend
![Page 69: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/69.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 69/75
BEAM
![Page 70: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/70.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 70/75
BEAM
![Page 71: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/71.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 71/75
Conclusión
![Page 72: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/72.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 72/75
4 días
![Page 73: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/73.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 73/75
4 x 24 = 96
96 x 60 = 5,7605,760 x 60 = 345,600
345,600 / 2,700,000 = 0.128s
![Page 74: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/74.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 74/75
Conclusión II
![Page 75: Procesando Millones de Imágenes Ruby vs Elixir](https://reader030.fdocumento.com/reader030/viewer/2022021219/577c7e211a28abe054a0aac2/html5/thumbnails/75.jpg)
8/17/2019 Procesando Millones de Imágenes Ruby vs Elixir
http://slidepdf.com/reader/full/procesando-millones-de-imagenes-ruby-vs-elixir 75/75
Fin