The polyline reader presented in the section
Developing a new reader is
not the best because it generates a large number of temporary objects.
What happens is that each time a polyline is read, a list, and hence
memory, is allocated to store its points. If the number of polylines
in the file is very high, this might cause memory to become fragmented
and also the frequent running of the garbage collector, thus impairing
performance.
To improve performance, the simple polyline reader can
be optimized so that the
IlvMapFeatureIterator always returns the same instance of
IlvMapFeature. The list for storing the points will be allocated
only once--when these points are read for the first time. During
subsequent readings, the list will be reallocated only if necessary.
To make this possible, the map feature returned by the
getNextFeature method is volatile, meaning that its geometry and
attributes must be used before the method is called again. All the
readers provided in the
JViews Maps library that implement the
IlvMapFeatureIterator interface work this way.
The complete source code for this optimized reader example
can be found in the following file:
The
readPolyline
method of
the class
OptimizedPolylineReader
resets
the points making up the
IlvMapLineString geometry
to 0. Note that this geometry is now a field of the class.
geometry.removeAll();
The points of each polyline read are stored in a coordinate
buffer. New instances of IlvCoordinate
are
created only if the polyline being read has more points than each
of the polylines previously read.
if (currentPointNum < oldPointNum) {
// Use an IlvCoordinate that was already allocated.
c = (IlvCoordinate)points.elementAt(currentPointNum);
} else {
c = new IlvCoordinate();
points.addElement(c);
}
Once the x,y
coordinates of
a polyline point are read, this point is added to the geometry. Geometries
are implemented in such a way that the addPoint
method
does not reallocate memory if one of the previously read geometries
had at least as many points as the current geometry that is being
read.
geometry.addPoint(c);
Also, the geometry attributes are stored as fields of
the OptimizedPolylineReader
class and modified
in the readPolyline
method.
if (buffer.length() > 0) {
stringAttribute.setString(buffer.toString());
attributeProperty.setAttribute(0,stringAttribute);
} else {
attributeProperty.setAttribute(0,null);
}
feature.setAttributes(attributeProperty);