Slide 1

Slide 1 text

Lazy Enumera,on Eric Hodel — [email protected]

Slide 2

Slide 2 text

Loop values = [1, 2, 3, 4] doubles = [] index = 0 while index < values.length do doubles << values[index] * 2 index += 1 end

Slide 3

Slide 3 text

Enumera,ng Where am I? values[index] Am I done? index < values.length What’s next? index += 1

Slide 4

Slide 4 text

Enumerator API Where am I? next #=> nil or exception if done Am I done? nil, StopIteration What’s next? handled for you

Slide 5

Slide 5 text

External Enumerator result = db_conn.exec ‘SELECT * FROM orders’ while order = result.next do # … end

Slide 6

Slide 6 text

Internal Enumerator result = db_conn.exec ‘SELECT * FROM orders’ result.each_row do |order| # … end

Slide 7

Slide 7 text

External vs Internal You write loop Impera,ve C, Ruby Loop built-in Func,onal Scheme, Ruby

Slide 8

Slide 8 text

Eager Enumera,on orders = db_conn.exec ‘SELECT total FROM orders’ total_order_value = orders.map { |order| # 10,000 values order[‘total’] }.reduce { |sum, order_total| sum + order_total }

Slide 9

Slide 9 text

Eager Enumera,on orders = db_conn.exec ‘SELECT total FROM orders’ total_order_value = orders.map { |order| # 100,000,000 values order[‘total’] }.reduce { |sum, order_total| sum + order_total }

Slide 10

Slide 10 text

100,000,000 Objects >> a = Array.new 100_000_000 >> ObjectSpace.memsize_of a => 800000040 800MB 400ms

Slide 11

Slide 11 text

Lazy Enumera,on orders = db_conn.exec ‘SELECT total FROM orders’ total_order_value = orders.lazy.map { |order| order[‘total’] }.reduce { |sum, order_total| sum + order_total } 10MB similar ,me

Slide 12

Slide 12 text

Eager Processing 100M 100M .map .map 100M .map 100M

Slide 13

Slide 13 text

Lazy Processing 1 1 .map .map 1 .map 1 2 2 2 2 3 3 3 3 … … … … 100M 100M 100M 100M

Slide 14

Slide 14 text

How does lazy work? Fibers!

Slide 15

Slide 15 text

Fiber? •Story line for a program •One Fiber runs at a ,me •Scheduled by author •“Corou,ne”

Slide 16

Slide 16 text

Hierarchy Process ↳Thread ↳Fiber OS scheduled Manually scheduled

Slide 17

Slide 17 text

Scheduling Fibers resume(input) #=> output Run a specific Fiber Fiber.yield(value) Return output to #resume

Slide 18

Slide 18 text

Ac,ve Fiber 1 1 .map .map 1 .map 1 2 2 2 2 3 3 3 3 … … … … 100M 100M 100M 100M Fiber Fiber Fiber Fiber

Slide 19

Slide 19 text

Example of Fiber ⃠

Slide 20

Slide 20 text

Lazy Enumera,on •Reduces memory used •Great for huge data sets •Processes one at a ,me •Uses Fiber (corou,ne)