Errno :: EINVAL无效的参数@ io_fread

时间:2017-05-01 21:35:02

标签: ruby

我试图下载~2GB文件并将其写入本地文件,但我遇到了这个问题:

enter image description here

以下是适用的代码:

  File.open(local_file, "wb") do |tempfile|
    puts "Downloading the backup..."

    pbar = nil
    open(backup_url,
         :read_timeout => nil,
         :content_length_proc => lambda do |content_length|
           if content_length&.positive?
             pbar = ProgressBar.create(:total => content_length)
           end
         end,
         :progress_proc => ->(size) { pbar&.progress = size }) do |retrieved|
          begin
            tempfile.binmode
            tempfile << retrieved.read
            tempfile.close
          rescue Exception => e
            binding.pry
          end
    end

1 个答案:

答案 0 :(得分:0)

分块读取文件。

引起问题的行在这里:

library(data.table) dat = data.table(dataset, key=c("PreyGroup", "date"))[ , weightcalc_ma := rollmean(weightcalc, k=4, fill=NA, na.rm=TRUE), by="PreyGroup"][ , weightcalc_new := ifelse(is.na(weightcalc), weightcalc_ma, weightcalc), by="PreyGroup"]

这会将全部内容读入内存,然后再将其写入tempfile << retrieved.read。如果内容很小,则没什么大不了,但是如果内容很大(多少取决于系统,配置,操作系统和可用资源),则可能会导致tempfile错误,例如{ {1}}和Errno::EINVAL

要解决此问题,请分块读取内容并将每个块写入Invalid argument @ io_fread。像这样:

Invalid argument @ io_write

这将获得tempfile个字节的数据块,并将每个数据块写入tempfile.write( retrieved.read( 1024 ) ) until retrieved.eof? ,直到1024到达文件末尾(即tempfile)。

如果retrieved不使用size参数,则可能需要将.eof?转换为retrieved.read,如下所示:

retrieved