2016-11-24 61 views
0

我有如下代碼:提高斯卡拉列表查詢

for (user <- allValidationTransaction){ 
    val u_t = allTrainTransaction.slice(0, allTrainTransaction. 
    indexWhere(_.Transaction_ID == user.Transaction_ID)). 
      filter(_.CARD_ID == user.CARD_ID) 
} 

我該如何提高呢?它很慢。

+2

使用'Vector'而不是'List'會有所改進。 – jwvh

+0

名單有多大?你可以使用平行集合嗎? – Pavel

+0

我的清單有600,000行。 – Nasir

回答

0

這將根據核心數量快四倍或更多倍。使用30000行兩個2.5Ghz核心的速度要快五倍。請注意,List越多,降級越多。

val allValidationTransaction: IndexedSeq[tranx] = IndexedSeq.fill(30000)(random) 
val allTrainTransaction : IndexedSeq[userx] = IndexedSeq.fill(30000)(random_u) 

for (user <- allValidationTransaction){ 
    val u_t = allTrainTransaction.par.slice(0, allTrainTransaction.par. 
    indexWhere(_.Transaction_ID == user.Transaction_ID)). 
     filter(_.CARD_ID == user.CARD_ID) 
} 

檢查CPU使用情況以觀察par集合如何分配計算。

+0

我不知道爲什麼,但它很慢。 :( – Nasir

+0

需要多少時間,也許在60萬行中,有必要採取其他策略,結構如何,你看過%CPU嗎? – EmiCareOfCell44

+0

謝謝你的迴應,我測試了它。 '.par'沒有'.par'比'IndexedSeq'快於'.par'而沒有'.par'。 – Nasir

0

如果您的收藏 - allValidationTransaction和allTrainTransaction無法隨機訪問,您的代碼效率不高。 例如,slice和indexWhere列表不是常量操作。 請參閱http://www.scala-lang.org/api/current/scala/collection/immutable/List.html

時間:列表有O(1)prepend和head/tail訪問。大多數其他 操作都是O(n)列表中元素的數量。這個 包括基於索引的元素查找,長度,追加和逆向。

此外,如果您的代碼遍歷每個用戶3次allTrainTransaction集合。

  1. 要找到具有相同的事務ID
  2. 切片(如果它不是隨機訪問)
  3. 要過濾如果你改變你的代碼具有相同的卡ID

指數程序風格,你可以獲得性能優勢。

以下是更新的答案。代碼未經測試。但它似乎工作。

@tailrec 
def helper[T](acc: Vector[T], trainTransactions: List[T], validTransaction: T): Vector[T] = 
    trainTransactions match { 
    case trainTransaction :: otherTrainTransactions if trainTransaction.Transaction_ID == validTransaction.Transaction_ID => 
     acc 

    case trainTransaction :: otherTrainTransactions if trainTransaction.CARD_ID == validTransaction.CARD_ID => 
     helper(acc :+ trainTransaction, otherTrainTransactions, validTransaction) 

    case trainTransaction :: otherTrainTransactions => 
     helper(acc, otherTrainTransactions, validTransaction) 

    case Nil => Nil 
    } 

allValidationTransaction.foldLeft(Vector.empty) { 
    case (acc, validationTransaction) => 
    acC++ helper(acc, allTrainTransactions, validationTransaction) 
} 
+0

你是對的,但函數式編程非常有趣,我想知道如何改進查詢? – Nasir