2012-01-03 21 views
5

Một mô hình không phải là hiếm trong vấn đề dự án Euler có vẻ là một cái gì đó tương đương với:thi đua một scala ParStream

Stream.from(1).map(f).takeWhile((_>0)).foldLeft(0L)(_+_) 

trong đó f là một số chức năng để đắt-tính toán trả về giá trị tích cực đến một lúc nào đó không rõ, và trả về số không sau đó.

Tôi thích những thứ song song, đặc biệt là khi các bộ sưu tập song song của Scala và .par làm cho việc này trở nên dễ dàng. Tuy nhiên, trong sự vắng mặt của một ParStream, tốt nhất mà tôi đưa ra là:

val BATCH=1024 
Stream.from(1,BATCH).flatMap(
    i=>(i until i+BATCH).par.map(f) 
).takeWhile((_>0)).foldLeft(0L)(_+_) 

mà không có vẻ rất thanh lịch và rất nhạy cảm với sự lựa chọn giá trị BATCH (nhưng có thể mang lại những cải thiện tốc độ x4 trên của tôi bốn nhân).

Bất kỳ đề xuất nào cho các cách rõ ràng hơn để đạt được cùng một kết quả?

+1

Ví dụ bạn đưa ra không tương đương: ví dụ với 'val f = 15 - (_: Int)' và 'BATCH = 10' cái đầu tiên cho 105 và số thứ hai 95 –

+0

@Luigi: Đó là lý do tại sao tôi đủ điều kiện với "trả về các giá trị dương lên đến ... và trả về số không sau đó". Ví dụ: nó hoạt động với def f (x) = 0 max (15-x). – timday

Trả lời

5

Vâng, bạn có thể làm cho nó một chút thanh lịch hơn với một cái gì đó giống như Stream from 1 grouped BATCH map (_.par), mặc dù tôi muốn sử dụng Iterator trong trường hợp này - trọng lượng nhẹ hơn nhiều so với Stream, và nó sẽ không lấp đầy bộ nhớ REPL như tôi thử nghiệm với nó.

+0

Cảm ơn; Tôi thậm chí còn không chú ý đến phương pháp được nhóm trước đó! – timday

Các vấn đề liên quan