Use activerecord-import for bulk importing tracepoint records

Non-rigourous testing shows a significant speedup, even on ssds.
This commit is contained in:
Andy Allan 2019-01-23 18:12:30 +01:00
parent 53cc1d2d11
commit 400db58036
4 changed files with 18 additions and 1 deletions

View file

@ -46,6 +46,7 @@ gem "image_optim_rails"
# Load rails plugins
gem "actionpack-page_caching"
gem "active_record_union"
gem "activerecord-import"
gem "cancancan"
gem "composite_primary_keys", "~> 11.1.0"
gem "config"

View file

@ -40,6 +40,8 @@ GEM
activemodel (= 5.2.2.1)
activesupport (= 5.2.2.1)
arel (>= 9.0)
activerecord-import (0.28.1)
activerecord (>= 3.2)
activestorage (5.2.2.1)
actionpack (= 5.2.2.1)
activerecord (= 5.2.2.1)
@ -423,6 +425,7 @@ DEPENDENCIES
aasm
actionpack-page_caching
active_record_union
activerecord-import
annotate
autoprefixer-rails (~> 8.6.3)
better_errors

View file

@ -289,6 +289,8 @@ 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
@ -303,9 +305,16 @@ class Trace < ActiveRecord::Base
tp.timestamp = point.timestamp
tp.gpx_id = id
tp.trackid = point.segment
tp.save!
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
Tracepoint.import(tracepoints)
if gpx.actual_points.positive?
max_lat = Tracepoint.where(:gpx_id => id).maximum(:latitude)
min_lat = Tracepoint.where(:gpx_id => id).minimum(:latitude)

View file

@ -206,6 +206,10 @@ class TraceTest < ActiveSupport::TestCase
trace.reload
assert_equal 1, Tracepoint.where(:gpx_id => trace.id).count
# Check that the tile has been set prior to the bulk import
# i.e. that the callbacks have been run correctly
assert_equal 3221331576, Tracepoint.where(:gpx_id => trace.id).first.tile
end
end