Tôi đang cố gắng xây dựng tiện ích cào sẽ cập nhật cơ sở dữ liệu của tôi thường xuyên.cơ sở dữ liệu cập nhật hàng loạt hiệu quả đường ray
Đây là mã tôi có cho đến nay:
namespace :utils do
# utils:update_ip
# Downloads the file frim <url> to the temp folder then unzips it in <file_path>
# Then updates the database.
desc "Update ip-to-country database"
task :update_ip => :environment do
require 'open-uri'
require 'zip/zipfilesystem'
require 'csv'
file_name = "ip-to-country.csv"
file_path = "#{RAILS_ROOT}/db/" + file_name
url = 'http://ip-to-country.webhosting.info/downloads/ip-to-country.csv.zip'
#check last time we updated the database.
mod_time = ''
mod_time = File.new(file_path).mtime.httpdate if File.exists? file_path
begin
puts 'Downloading update...'
#send conditional GET to server
zipped_file = open(url, {'If-Modified-Since' => mod_time})
rescue OpenURI::HTTPError => the_error
if the_error.io.status[0] == '304'
puts 'Nothing to update.'
else
puts 'HTTPError: ' + the_error.message
end
else # file was downloaded without error.
Rails.logger.info 'ip-to-coutry: Remote database was last updated: ' + zipped_file.meta['last-modified']
delay = Time.now - zipped_file.last_modified
Rails.logger.info "ip-to-country: Database was outdated for: #{delay} seconds (#{delay/60/60/24 } days)"
puts 'Unzipping...'
File.delete(file_path) if File.exists? file_path
Zip::ZipFile.open(zipped_file.path) do |zipfile|
zipfile.extract(file_name, file_path)
end
Iptocs.delete_all
puts "Importing new database..."
# TODO: way, way too heavy find a better solution.
CSV.open(file_path, 'r') do |row|
ip = Iptocs.new( :ip_from => row.shift,
:ip_to => row.shift,
:country_code2 => row.shift,
:country_code3 => row.shift,
:country_name => row.shift)
ip.save
end #CSV
puts "Complete."
end #begin-resuce
end #task
end #namespace
Vấn đề tôi đang gặp là điều này mất một vài phút để nhập 100.000 mục cộng. Tôi muốn tìm một cách hiệu quả hơn để cập nhật cơ sở dữ liệu của mình. Lý tưởng nhất là điều này sẽ vẫn độc lập với kiểu cơ sở dữ liệu, nhưng nếu không phải máy chủ sản xuất của tôi sẽ chạy trên MySQL.
Cảm ơn bạn đã có thông tin chi tiết.
Đây là chính xác những gì tôi đang tìm kiếm, cảm ơn bạn. – codr
Đá quý hỗ trợ nhập từ CSV. Điều này giúp loại bỏ chi phí xác thực và xác thực 'ActiveRecord'. Tham khảo bài viết này để biết thêm chi tiết. http://www.rubyinside.com/advent2006/17-extendingar.html –
Giúp tôi - cảm ơn! – ambertch