ruby-on-rails - 通过heroku上的sidekiq导入csv的file.path问题

标签 ruby-on-rails heroku sidekiq

我正在使用后台作业将用户数据从 csv 文件导入我的数据集。首先,我通过简单地在我的 User 模型中调用一个方法并传递通过表单 file_field 传输的文件路径,在我的 User 模型中做了这个“硬”:

User.import_csv(params[:file].path)

在本地和生产(heroku)上运行良好。

现在,当涉及到巨大的 CSV 文件时,我明白我需要一份工作来在后台执行此导入。我熟悉 redis 和 sidekiq,所以工作很快就建立起来了。
CsvImportJob.perform_async(URI.parse(params[:file].path))

在我的 worker 中:
def perform(file_path)

  User.import_csv(file_path)

end

嗯,这在本地也很完美,但是一旦我在生产中点击它,我就会在我的日志中看到以下错误:
» 10 Aug 2015 13:56:26.596 2015-08-10 11:56:25.987726+00:00 app worker.1 - - 3 TID-oqvt6v1d4 ERROR: Actor crashed!
» 10 Aug 2015 13:56:26.596 2015-08-10 11:56:25.987728+00:00 app worker.1 - - Errno::ENOENT: No such file or directory @ rb_sysopen - /tmp/RackMultipart20150810-6-14u804c.csv
» 10 Aug 2015 13:56:26.596 2015-08-10 11:56:25.987730+00:00 app worker.1 - - /app/vendor/ruby-2.2.2/lib/ruby/2.2.0/csv.rb:1256:in `initialize'

这意味着是 file_path 变量。
不知何故,当我将文件传递给 sidekiq 作业时,heroku 无法找到该文件。当我在没有 sidekiq 的情况下执行此操作时,它会起作用。

我真的不知道如何解决这个问题,所以任何帮助表示赞赏。

最佳答案

我有同样的经历,你可以在 https://github.com/coderaven/datatable-exercise/tree/parallel_processing 看看我的一个类似项目

(基本上只关注 object_record.rb 模型和作业:import_csv_job.rb 和 process_csv_job.rb)

错误: Errno::ENOENT: No such file or directory @rb_sysopen
如果您说这适用于 heroku,那么这可能意味着您获得的路径是有效的(在您的示例中,您使用的是/tmp/路径)

所以这里有 2 个可能的问题及其解决方案:

1.) 您保存了一个未知的 Heroku 路径(或无法访问的路径),该路径在应用程序运行时无法访问或打开。 因为,在处理没有 sidekiq 的导入 csv 时 - 您上传的文件暂时保存在内存中,直到您完成处理 csv - 但是,在作业调度程序(或 sidekiq)中,路径不应该在内存中,而应该是现有的应用程序可访问的路径。

解决方案:将文件保存到某个地方的存储中(heroku 有一个临时文件系统,因此您无法通过正在运行的网络应用程序保存文件)来解决这个问题,您必须使用类似 Amazon S3 的服务(您也可以使用 Google Drive 之类的我做了)将您的文件保存在那里,然后将路径提供给您的 sidekiq 工作人员 - 这样它就可以稍后访问和处理它。

2.) 如果路径正确并且文件被正确保存或处理,那么根据我的经验 可能是您使用的是 File.open 而不是 open-uri 的 open 方法。 File.open 不接受远程文件,您需要在您的工作人员上要求 open-uri,然后使用 open 方法来解决远程文件。

前任。

require 'open-uri'

class ProcessCsvJob < ActiveJob::Base
  queue_as :default

  def perform(csv_path)
    csv_file = open(csv_path,'rb:UTF-8')

    SmarterCSV.process(csv_file) do |array|
        .... code here for processing ...
    end
  end

end

我完全知道这个问题已经过去了将近一年,所以如果你已经解决了这个问题或者这个答案有效,那么它也可以帮助那些可能会遇到同样问题的人作为文档存档。

关于ruby-on-rails - 通过heroku上的sidekiq导入csv的file.path问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31919775/

相关文章:

Heroku pgAdmin4 隐藏我不允许访问的数据库

ruby-on-rails-3 - Redis上的ECONNREFUSED怎么办?

ruby-on-rails - 构建异步邮件程序的最佳实践(使用 Sidekiq)

ruby-on-rails - 关联问题创建

javascript - 在 CoffeeScript 中解析 Rails 模型错误

heroku - 从 url 读取 pydub AudioSegment。 BytesIO 仅在 heroku 上返回 "OSError [Errno 2] No such file or directory";在本地主机上很好

node.js - Heroku 上的 Node 应用程序由于只读文件系统而失败

ruby-on-rails - 当时间很重要时,如何在 ruby​​ (on rails) 中安排进程/任务?

ruby-on-rails - 如何保护我的网站免受多个帖子请求的影响?

ruby-on-rails - 像 http://host.com/controller-action-controller 这样的 Rails 路由