[SPARK-1535] ALS: Avoid the garbage-creating ctor of DoubleMatrix
`new DoubleMatrix(double[])` creates a garbage `double[]` of the same length as its argument and immediately throws it away. This pull request avoids that constructor in the ALS code. Author: Tor Myklebust <tmyklebu@gmail.com> Closes #442 from tmyklebu/foo2 and squashes the following commits: 2784fc5 [Tor Myklebust] Mention that this is probably fixed as of jblas 1.2.4; repunctuate. a09904f [Tor Myklebust] Helper function for wrapping Array[Double]'s with DoubleMatrix's.
This commit is contained in:
parent
10d04213ff
commit
25fc31884b
|
@ -269,7 +269,7 @@ class ALS private (
|
|||
private def computeYtY(factors: RDD[(Int, Array[Array[Double]])]) = {
|
||||
val n = rank * (rank + 1) / 2
|
||||
val LYtY = factors.values.aggregate(new DoubleMatrix(n))( seqOp = (L, Y) => {
|
||||
Y.foreach(y => dspr(1.0, new DoubleMatrix(y), L))
|
||||
Y.foreach(y => dspr(1.0, wrapDoubleArray(y), L))
|
||||
L
|
||||
}, combOp = (L1, L2) => {
|
||||
L1.addi(L2)
|
||||
|
@ -304,6 +304,15 @@ class ALS private (
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrap a double array in a DoubleMatrix without creating garbage.
|
||||
* This is a temporary fix for jblas 1.2.3; it should be safe to move back to the
|
||||
* DoubleMatrix(double[]) constructor come jblas 1.2.4.
|
||||
*/
|
||||
private def wrapDoubleArray(v: Array[Double]): DoubleMatrix = {
|
||||
new DoubleMatrix(v.length, 1, v: _*)
|
||||
}
|
||||
|
||||
/**
|
||||
* Flatten out blocked user or product factors into an RDD of (id, factor vector) pairs
|
||||
*/
|
||||
|
@ -457,7 +466,7 @@ class ALS private (
|
|||
// block
|
||||
for (productBlock <- 0 until numBlocks) {
|
||||
for (p <- 0 until blockFactors(productBlock).length) {
|
||||
val x = new DoubleMatrix(blockFactors(productBlock)(p))
|
||||
val x = wrapDoubleArray(blockFactors(productBlock)(p))
|
||||
tempXtX.fill(0.0)
|
||||
dspr(1.0, x, tempXtX)
|
||||
val (us, rs) = inLinkBlock.ratingsForBlock(productBlock)(p)
|
||||
|
|
Loading…
Reference in a new issue