【发布时间】:2016-08-09 10:14:11
【问题描述】:
我刚刚开始进行 Scala 开发,并尝试使用过滤器和收集从迭代器中过滤掉不必要的行。但是操作好像太慢了。
val src = Source.fromFile("/home/Documents/1987.csv") // 1.2 Million
val iter = src.getLines().map(_.split(":"))
val iter250 = iter.take(250000) // Only interested in the first 250,000
val intrestedIndices = range(1, 100000, 3).toSeq // This could be any order
val slicedData = iter250.zipWithIndex
// Takes 3 minutes
val firstCase = slicedData.collect { case (x, i) if intrestedIndices.contains(i) => x }.size
// Takes 3 minutes
val secondCase = slicedData.filter(x => intrestedIndices.contains(x._2)).size
// Takes 1 second
val thirdCase = slicedData.collect { case (x,i ) if i % 3 == 0 => x}.size
似乎 intrestedIndices.contains(_) 部分在第一种和第二种情况下减慢了程序的速度。有没有其他方法可以加快这个过程。
【问题讨论】:
-
您的第三个案例是正确的选择。为什么要使用 contains(_)?
-
您在前两种情况下以线性时间迭代所有
interestedIndices。使用Set而不是Seq来提高性能 -
@SergeyLagutin 换一个字符 :)
val intrestedIndices = range(1, 100000, 3).toSe**t** -
@Nyavro 在某些情况下顺序可能是随机的
-
@SergeyLagutin 谢谢,这对我想做的事情起到了作用
标签: performance scala optimization filter collect