From b3d6d4291e19e1368b48d13cf67880f7c59b5d24 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Sun, 24 Jun 2007 10:38:31 +0000 Subject: [PATCH] Use a multi-pass approach to parsing GPX files to keep memory usage down. --- lib/osm.rb | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/lib/osm.rb b/lib/osm.rb index ae8e70896..dea48cc71 100644 --- a/lib/osm.rb +++ b/lib/osm.rb @@ -69,13 +69,13 @@ module OSM attr_reader :tracksegs def initialize(filename) + @filename = filename + end + + def points @possible_points = 0 @actual_points = 0 @tracksegs = 0 - @points = [] - - file = File.new(filename) - parser = REXML::Parsers::SAX2Parser.new( file ) lat = -1 lon = -1 @@ -85,6 +85,8 @@ module OSM gotele = false gotdate = false + parser = REXML::Parsers::SAX2Parser.new(File.new(@filename)) + parser.listen( :start_element, %w{ trkpt }) do |uri,localname,qname,attributes| lat = attributes['lat'].to_f lon = attributes['lon'].to_f @@ -113,18 +115,15 @@ module OSM ele = '0' unless gotele if lat < 90 && lat > -90 && lon > -180 && lon < 180 @actual_points += 1 - @points.push(Hash['latitude' => lat,'longitude' => lon,'timestamp' => date,'altitude' => ele,'segment' => @tracksegs]) + yield Hash['latitude' => lat, 'longitude' => lon, 'timestamp' => date, 'altitude' => ele, 'segment' => @tracksegs] end end gotlatlon = false gotele = false gotdate = false end - parser.parse - end - def points - @points.each { |p| yield p } + parser.parse end def get_picture(min_lat, min_lon, max_lat, max_lon, num_points) -- 2.39.5