StreamOpFlag.* and OutOfMemoryError when going parall
Christian Mallwitz
c.mallwitz at gmail.com
Wed Dec 5 10:18:46 PST 2012
Hi,
Using lambda-8-b67-linux-i586-03_dec_2012 I'm trying to compute n (not
necessarily the first n) prime numbers:
import java.util.*;
import java.util.function.*;
import java.util.stream.*;
public class LambdaExample3 {
public static boolean isPrime(long n) {
if (n <= 1) { return false; }
if (n == 2) { return true; }
for (int i = 2; i <= Math.sqrt(n) + 1; i++) { if (n % i == 0)
return false; }
return true;
}
public static void main(String[] args) {
Stream<Long> stream =
Streams.parallel(Streams.spliteratorUnknownSize(new Iterator<Long>() {
private long n = 0;
@Override public boolean hasNext() { return true; }
@Override public Long next() { return ++n; }
}),
// fails with OutOfMemoryError
// StreamOpFlag.toStreamFlags(StreamOpFlag.NOT_SIZED,
StreamOpFlag.INITIAL_OPS_VALUE)
// fails with OutOfMemoryError
// StreamOpFlag.NOT_SIZED
// works, but no speed-up to non-parallel version
StreamOpFlag.INITIAL_OPS_VALUE
);
stream
.filter(LambdaExample3::isPrime)
.limit(300000)
.forEach(l -> { /*System.out.println(l);*/ });
}
}
I'm struggling with the StreamOpFlag parameter. What should I pick?
INITIAL_OPS_VALUE seems to work but isn't running anything in parallel
(at least it is not faster than the serial version). NOT_SIZED isn't
working but failing miserably with an OutOfMemoryError. IS_PARALLEL
is not needed because I already use parallel() - should specifying
IS_PARALLEL and using Streams.stream() supposed to go parallel as
well?
Is the OutOfMemoryError caused by a bug? The OutOfMemoryError is
reported from a fork/join pool thread so at least it is going
parallel? Am I missing something?
Thanks
Christian
More information about the lambda-dev
mailing list