×
Copy
Open
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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)