我已经完成了这项工作,但是对于十几个左右的文件来说,它的速度非常慢(到了超时的程度)。
它从 Dropbox 中获取目录列表,并将其与表的内容进行比较。我想对此进行优化,使其尽可能快速有效地运行。我知道每次查询都不是最佳的,但我认为主要的延迟是在Photo.create
方法期间,因为它将文件从保管箱文件夹复制到 Amazon S3(通过carrierwave gem
)。我正在考虑花时间进行操作,以了解延迟的来源。对于包含 10 个文件的文件夹,加载页面需要一分钟多的时间。奇怪的是,即使它跳过这些文件也需要这么长时间,因为它们已经存在,这对我来说毫无意义。
这是我的控制器代码:
def sync
photo_size = 1024
@event = Event.find(params[:id])
@client = Dropbox::API::Client.new(:token => 'derp', :secret => 'herp')
@dropbox_files = @client.ls "images/#{@event.keyword}/#{photo_size}/"
@existing_photos = @event.photos.all
@data = []
# TODO: need to make it not add files multiple times
@dropbox_files.each do |f|
photo_exists = Photo.where(:dropbox_path => f.direct_url.url).count
if photo_exists == 0
@photo = Photo.create(:remote_filename_url => f.direct_url.url,
:dropbox_path => f.direct_url.url,
:event_id => @event.id)
@data << "Added: #{f.direct_url.url.split('/').last}"
else
@data << "Skipped: #{f.direct_url.url.split('/').last}"
end
end
end
理想情况下,我想将每个Photo.create
调用分成一个异步请求,但这可能是一个完整的“没什么”。现在,如果它可以处理从 100 张照片中添加 5 张照片而不会超时的东西,我会很高兴。
做这个的最好方式是什么?我是一名 PHP 程序员,刚接触 RoR3。请帮忙。谢谢!
注意:目前,这会输出到屏幕,但最终它将成为后台操作。