From: Andy Allan Date: Wed, 20 Mar 2019 09:14:11 +0000 (+0100) Subject: Use an enumerator for gpx.points, and process the the points in batches X-Git-Tag: live~3226^2 X-Git-Url: https://git.openstreetmap.org./rails.git/commitdiff_plain/c1bf73bee42000aadb56cdaeab650e26a284b0b2?ds=inline;hp=-c Use an enumerator for gpx.points, and process the the points in batches --- c1bf73bee42000aadb56cdaeab650e26a284b0b2 diff --git a/app/models/trace.rb b/app/models/trace.rb index 3d23d02c8..0e8763328 100644 --- a/app/models/trace.rb +++ b/app/models/trace.rb @@ -289,31 +289,35 @@ class Trace < ActiveRecord::Base # If there are any existing points for this trace then delete them Tracepoint.where(:gpx_id => id).delete_all - # Gather the trace points together for a bulk import - tracepoints = [] - gpx.points do |point| - if first - f_lat = point.latitude - f_lon = point.longitude - first = false + gpx.points.each_slice(1_000) do |points| + # Gather the trace points together for a bulk import + tracepoints = [] + + points.each do |point| + if first + f_lat = point.latitude + f_lon = point.longitude + first = false + end + + tp = Tracepoint.new + tp.lat = point.latitude + tp.lon = point.longitude + tp.altitude = point.altitude + tp.timestamp = point.timestamp + tp.gpx_id = id + tp.trackid = point.segment + tracepoints << tp end - tp = Tracepoint.new - tp.lat = point.latitude - tp.lon = point.longitude - tp.altitude = point.altitude - tp.timestamp = point.timestamp - tp.gpx_id = id - tp.trackid = point.segment - tracepoints << tp - end + # Run the before_save and before_create callbacks, and then import them in bulk with activerecord-import + tracepoints.each do |tp| + tp.run_callbacks(:save) { false } + tp.run_callbacks(:create) { false } + end - # Run the before_save and before_create callbacks, and then import them in bulk with activerecord-import - tracepoints.each do |tp| - tp.run_callbacks(:save) { false } - tp.run_callbacks(:create) { false } + Tracepoint.import!(tracepoints) end - Tracepoint.import!(tracepoints, :batch_size => 1_000) if gpx.actual_points.positive? max_lat = Tracepoint.where(:gpx_id => id).maximum(:latitude) diff --git a/lib/gpx.rb b/lib/gpx.rb index 5664e0099..721e5608b 100644 --- a/lib/gpx.rb +++ b/lib/gpx.rb @@ -13,6 +13,8 @@ module GPX end def points + return enum_for(:points) unless block_given? + @possible_points = 0 @actual_points = 0 @tracksegs = 0