2016-04-05 14 views
1

en çok paralel gelen erişim dizisi Ben aşağıdaki kod parçası var:Scala - Bir ÅŸan şekilde

//variable arrayToAccess is an array of integers 
//anotherArray holds integers also 
anotherArray.par.foreach{ item => 
    val mathValue = mathematicalCalculation(item) 
    if (mathValue > arrayToAccess.last) { 
     //append element 
     arrayToAccess :+= mathValue 
     //sort array and store it in the same variable 
     arrayToAccess = arrayToAccess.sortWith((i1,i2) => i1 > i2).take(5) 
    } 
} 

Yani o anlamda arrayToAccess değişkeni erişen ÅŸan olmadığını düşünüyorum. Yukarıdaki kodu konulara uygun bir şekilde nasıl uygularım? Ayrıca, anotherArray.par'ın paralellik düzeyini de kontrol edebilir miyim (örneğin, yalnızca 8 adet 2 çekirdeği kullanın)? Değilse, onu kontrol etmenin bir yolu var mı?

cevap

2

Bunu göz ardı ediyorsunuz. Sadece yapın:

arrayToAccess = anotherArray.par 
    .map { mathematicalCalculation _ } 
    .seq 
    .sorted 
    .reverse 
    .take(5) 

Bu sizin kod amaçlanmıştır aynı sonucu verir, ancak iş parçacığı güvenlidir. sıralama adım alacağını zaman hakkında endişeleriniz varsa

Güncelleme, sadece yerine doğrusal zamanda ilk beş seçebilirsiniz: paralelliği yapılandırılması ile ilgili olarak

val top(data: Array[Int], n: Int) = { 
val queue = PriorityQueue()(Ordering[Int].reverse) 
data.fold(queue) { case(q,n) => 
    q.enqueue(n) 
    while(q.size > 5) q.dequeue 
    queue 
} 
.toArray 
.sorted 
.reversed 

, bence, bu yardımcı olacaktır: http://docs.scala-lang.org/overviews/parallel-collections/configuration

sıralamaya adım hakkında endişeleriniz varsa Güncelleme, bir paralel tür ile değiştirin olabilir veya bu gibi doğrusal zamanda sınırlı bir öncelik sırasına kat:

def topN(data: Array[Int], n: Int) = {  
    val queue = PriorityQueue()(Ordering[Int].reverse) 
    data.foldLeft(queue) { case (q, x) => 
    q.enqueue(x) 
    while(q.size > n) q.dequeue 
    q 
    }.dequeueAll.reverse 
+0

'.seq.sorted.reverse.take (5)' – Aivean

+0

@Aivean thanks. Sabit. – Dima

+0

anotherArray değişkeni çok büyükse, sıralı yöntem ve ters yöntem zaman alacak, değil mi? Özellikle daha karmaşık bir sıralama yöntemi ise. –