Implements combining contents of two combiners
by postponing the operation until result
method is called.
Implements combining contents of two combiners
by postponing the operation until result
method is called. It chains
the leaf results together instead of evaluating the actual collection.
the type of the elements in the combiner
the type of the collection the combiner produces
the type of the buffers that contain leaf results and this combiner chains together
Parallel sequence holding elements in a linear array.
Parallel sequence holding elements in a linear array.
ParArray
is a parallel sequence with a predefined size. The size of the array
cannot be changed after it's been created.
ParArray
internally keeps an array containing the elements. This means that
bulk operations based on traversal ensure fast access to elements. ParArray
uses lazy builders that
create the internal data array only after the size of the array is known. In the meantime, they keep
the result set fragmented. The fragments
are copied into the resulting data array in parallel using fast array copy operations once all the combiners
are populated in parallel.
type of the elements in the array
2.9
Scala's Parallel Collections Library overview
section on ParArray
for more information.
Parallel flat hash table.
Parallel flat hash table.
type of the elements in the table.
A parallel hash map.
A parallel hash map.
ParHashMap
is a parallel map which internally keeps elements within a hash table.
It uses chaining to resolve collisions.
type of the keys in the parallel hash map
type of the values in the parallel hash map
A parallel hash set.
A parallel hash set.
ParHashSet
is a parallel set which internally keeps elements within a hash table.
It uses linear probing to resolve collisions.
type of the elements in the parallel hash set .
Provides functionality for hash tables with linked list buckets, enriching the data structure by fulfilling certain requirements for their parallel construction and iteration.
A template trait for mutable parallel iterable collections.
A template trait for mutable parallel iterable collections.
This is a base trait for Scala parallel collections. It defines behaviour
common to all parallel collections. Concrete parallel collections should
inherit this trait and ParIterable
if they want to define specific combiner
factories.
Parallel operations are implemented with divide and conquer style algorithms that parallelize well. The basic idea is to split the collection into smaller parts until they are small enough to be operated on sequentially.
All of the parallel operations are implemented as tasks within this trait. Tasks rely on the concept of splitters, which extend iterators. Every parallel collection defines:
def splitter: IterableSplitter[T]
which returns an instance of IterableSplitter[T]
, which is a subtype of Splitter[T]
.
Splitters have a method remaining
to check the remaining number of elements,
and method split
which is defined by splitters. Method split
divides the splitters
iterate over into disjunct subsets:
def split: Seq[Splitter]
which splits the splitter into a sequence of disjunct subsplitters. This is typically a very fast operation which simply creates wrappers around the receiver collection. This can be repeated recursively.
Tasks are scheduled for execution through a
scala.collection.parallel.TaskSupport object, which can be changed
through the tasksupport
setter of the collection.
Method newCombiner
produces a new combiner. Combiners are an extension of builders.
They provide a method combine
which combines two combiners and returns a combiner
containing elements of both combiners.
This method can be implemented by aggressively copying all the elements into the new combiner
or by lazily binding their results. It is recommended to avoid copying all of
the elements for performance reasons, although that cost might be negligible depending on
the use case. Standard parallel collection combiners avoid copying when merging results,
relying either on a two-step lazy construction or specific data-structure properties.
Methods:
def seq: Sequential def par: Repr
produce the sequential or parallel implementation of the collection, respectively.
Method par
just returns a reference to this parallel collection.
Method seq
is efficient - it will not copy the elements. Instead,
it will create a sequential version of the collection using the same underlying data structure.
Note that this is not the case for sequential collections in general - they may copy the elements
and produce a different underlying data structure.
The combination of methods toMap
, toSeq
or toSet
along with par
and seq
is a flexible
way to change between different collection types.
Since this trait extends the GenIterable
trait, methods like size
must also
be implemented in concrete collections, while iterator
forwards to splitter
by
default.
Each parallel collection is bound to a specific fork/join pool, on which dormant worker
threads are kept. The fork/join pool contains other information such as the parallelism
level, that is, the number of processors used. When a collection is created, it is assigned the
default fork/join pool found in the scala.parallel
package object.
Parallel collections are not necessarily ordered in terms of the foreach
operation (see Traversable
). Parallel sequences have a well defined order for iterators - creating
an iterator and traversing the elements linearly will always yield the same order.
However, bulk operations such as foreach
, map
or filter
always occur in undefined orders for all
parallel collections.
Existing parallel collection implementations provide strict parallel iterators. Strict parallel iterators are aware
of the number of elements they have yet to traverse. It's also possible to provide non-strict parallel iterators,
which do not know the number of elements remaining. To do this, the new collection implementation must override
isStrictSplitterCollection
to false
. This will make some operations unavailable.
To create a new parallel collection, extend the ParIterable
trait, and implement size
, splitter
,
newCombiner
and seq
. Having an implicit combiner factory requires extending this trait in addition, as
well as providing a companion object, as with regular collections.
Method size
is implemented as a constant time operation for parallel collections, and parallel collection
operations rely on this assumption.
The higher-order functions passed to certain operations may contain side-effects. Since implementations of bulk operations may not be sequential, this means that side-effects may not be predictable and may produce data-races, deadlocks or invalidation of state if care is not taken. It is up to the programmer to either avoid using side-effects or to use some form of synchronization when accessing mutable data.
the element type of the collection
2.9
A template trait for mutable parallel maps.
A template trait for mutable parallel maps.
The higher-order functions passed to certain operations may contain side-effects. Since implementations of bulk operations may not be sequential, this means that side-effects may not be predictable and may produce data-races, deadlocks or invalidation of state if care is not taken. It is up to the programmer to either avoid using side-effects or to use some form of synchronization when accessing mutable data.
the key type of the map
the value type of the map
2.9
A template trait for mutable parallel maps.
A template trait for mutable parallel maps. This trait is to be mixed in with concrete parallel maps to override the representation type.
The higher-order functions passed to certain operations may contain side-effects. Since implementations of bulk operations may not be sequential, this means that side-effects may not be predictable and may produce data-races, deadlocks or invalidation of state if care is not taken. It is up to the programmer to either avoid using side-effects or to use some form of synchronization when accessing mutable data.
the key type of the map
the value type of the map
A mutable variant of ParSeq
.
A mutable variant of ParSet
.
A template trait for mutable parallel sets.
A template trait for mutable parallel sets. This trait is mixed in with concrete parallel sets to override the representation type.
The higher-order functions passed to certain operations may contain side-effects. Since implementations of bulk operations may not be sequential, this means that side-effects may not be predictable and may produce data-races, deadlocks or invalidation of state if care is not taken. It is up to the programmer to either avoid using side-effects or to use some form of synchronization when accessing mutable data.
the element type of the set
Parallel TrieMap collection.
Parallel TrieMap collection.
It has its bulk operations parallelized, but uses the snapshot operation to create the splitter. This means that parallel bulk operations can be called concurrently with the modifications.
2.10
Scala's Parallel Collections Library overview
section on ParTrieMap
for more information.
An array combiner that uses a chain of arraybuffers to store elements.
An array combiner that uses doubling unrolled buffers to store elements.
This object provides a set of operations to create
values.mutable.ParArray
This object provides a set of operations needed to create
values.mutable.ParHashMap
This object provides a set of operations needed to create
values.mutable.ParHashSet
This object provides a set of operations to create
values.ParIterable
This object provides a set of operations to create
values.mutable.ParSeq
This object provides a set of operations needed to create
values.mutable.ParSet