我有如下代碼:提高斯卡拉列表查詢
for (user <- allValidationTransaction){
val u_t = allTrainTransaction.slice(0, allTrainTransaction.
indexWhere(_.Transaction_ID == user.Transaction_ID)).
filter(_.CARD_ID == user.CARD_ID)
}
我該如何提高呢?它很慢。
我有如下代碼:提高斯卡拉列表查詢
for (user <- allValidationTransaction){
val u_t = allTrainTransaction.slice(0, allTrainTransaction.
indexWhere(_.Transaction_ID == user.Transaction_ID)).
filter(_.CARD_ID == user.CARD_ID)
}
我該如何提高呢?它很慢。
這將根據核心數量快四倍或更多倍。使用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集合如何分配計算。
我不知道爲什麼,但它很慢。 :( – Nasir
需要多少時間,也許在60萬行中,有必要採取其他策略,結構如何,你看過%CPU嗎? – EmiCareOfCell44
謝謝你的迴應,我測試了它。 '.par'沒有'.par'比'IndexedSeq'快於'.par'而沒有'.par'。 – Nasir
如果您的收藏 - 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集合。
指數程序風格,你可以獲得性能優勢。
以下是更新的答案。代碼未經測試。但它似乎工作。
@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)
}
你是對的,但函數式編程非常有趣,我想知道如何改進查詢? – Nasir
使用'Vector'而不是'List'會有所改進。 – jwvh
名單有多大?你可以使用平行集合嗎? – Pavel
我的清單有600,000行。 – Nasir