我试图下载~2GB文件并将其写入本地文件,但我遇到了这个问题:
以下是适用的代码:
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
答案 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