2012-01-03 7 views
5

bir öykünen Proje Euler sorunlar nadir değildir desen eşdeğer bir şey gibi görünüyor:bir scala ParStream

f bilinmeyen bir noktaya kadar olumlu değerleri döndürür bazı pahalı-to-bilgi işlem fonksiyonu olan
Stream.from(1).map(f).takeWhile((_>0)).foldLeft(0L)(_+_) 

ve Bundan sonra sıfırlar döndürür.

Özellikle Scala'nın paralel koleksiyonları ve .par'un işleri kolaylaştırması gibi şeyleri paralel hale getirmek istiyorum. Ama bir ParStream yokluğunda, iyi ben ile geldim: çok şık görünüyor ve BATCH değerin seçimine duyarlıdır (ancak üzerinde x4 hız artışı sağlayabilir gelmez

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

benim dört çekirdekli).

Aynı sonuca ulaşmanın daha temiz yolları için önerileriniz var mı?

+1

Verdiğiniz örnekler, eşdeğer değildir: örneğin, "val f = 15 - (_: Int)" ve "BATCH = 10" ile ilk 105 ve ikinci 95 –

+0

@ Luigi: Bu nedenle "ile pozitif değerlerini döndürür ... ve bundan sonra sıfırlar döndürür". örneğin f (x) = 0 max (15-x) ile çalışır. – timday

cevap

5

Eh, doğrusu bu durumda Iterator kullanmayı tercih olsa, Stream from 1 grouped BATCH map (_.par) gibi bir şey ile biraz daha şık yapabilirsiniz - daha hafif ağırlık Stream daha, ben denemeler gibi Repl hafızasını doldurmak olmaz o.

+0

Teşekkürler; Daha önce gruplanmış yöntemi bile fark etmemiştim! – timday