Significantly reduce memory usage by MergeBuildingAddress#getAddressPoints

This reduces CPU usage by 98.6% and memory allocations by 99.6%.
The time for adding all addresses in the
`39.69427;-86.104252;39.72361;-86.082427` download area went from ~1.25
minutes to ~10 seconds (~86% reduction).

Signed-off-by: Taylor Smock <tsmock@meta.com>
pull/14/head
Taylor Smock 2022-12-20 06:42:52 -07:00
rodzic 84682ba8c6
commit de47e9c589
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 233BB2E466604E27
2 zmienionych plików z 11 dodań i 4 usunięć

Wyświetl plik

@ -7,6 +7,7 @@ import java.awt.GraphicsEnvironment;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@ -78,7 +79,7 @@ public abstract class AbstractConflationCommand extends Command {
* @return The command that will be run (may be {@code null})
*/
public Command getCommand(Collection<OsmPrimitive> primitives) {
possiblyAffectedPrimitives = primitives.stream().distinct().collect(Collectors.toList());
possiblyAffectedPrimitives = new HashSet<>(primitives);
return getRealCommand();
}

Wyświetl plik

@ -7,6 +7,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@ -18,6 +19,7 @@ import org.openstreetmap.josm.command.DeleteCommand;
import org.openstreetmap.josm.command.SequenceCommand;
import org.openstreetmap.josm.data.osm.BBox;
import org.openstreetmap.josm.data.osm.DataSet;
import org.openstreetmap.josm.data.osm.IPrimitive;
import org.openstreetmap.josm.data.osm.Node;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.Relation;
@ -121,9 +123,13 @@ public class MergeBuildingAddress extends AbstractConflationCommand {
}
private static Collection<Node> getAddressPoints(OsmPrimitive prim) {
return Geometry.filterInsideAnyPolygon(new ArrayList<>(prim.getDataSet().allNonDeletedPrimitives()), prim)
.stream().filter(Node.class::isInstance).map(Node.class::cast).filter(n -> n.hasTag(KEY))
.collect(Collectors.toList());
BBox bbox = prim.getBBox();
final Collection<IPrimitive> searchCollection = new HashSet<>();
searchCollection.addAll(prim.getDataSet().searchNodes(bbox));
searchCollection.addAll(prim.getDataSet().searchWays(bbox));
searchCollection.addAll(prim.getDataSet().searchRelations(bbox));
return Geometry.filterInsideAnyPolygon(searchCollection, prim).stream().filter(Node.class::isInstance)
.map(Node.class::cast).filter(n -> n.hasTag(KEY)).collect(Collectors.toList());
}
/**