gpt4 book ai didi

ruby - Errno::EINVAL 无效参数@io_fread

转载 作者:行者123 更新时间:2023-12-03 14:58:50 29 4
gpt4 key购买 nike

我正在尝试下载一个 ~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

最佳答案

分块读取您的文件。
导致问题的线路在这里:tempfile << retrieved.read这会将整个内容读入内存,然后再将其写入 tempfile .如果内容很小,这没什么大不了的,但如果内容很大(多大取决于系统、配置、操作系统和可用资源),这可能会导致 Errno::EINVAL错误,如 Invalid argument @ io_freadInvalid argument @ io_write .
要解决此问题,请分块读取内容并将每个块写入 tempfile .像这样的东西:

tempfile.write( retrieved.read( 1024 ) ) until retrieved.eof?
这将获得 1024 的块字节并将每个块写入 tempfile直到 retrieved到达文件末尾(即 .eof? )。
retrieved.read不带大小参数,您可能需要转换 retrievedStringIO , 像这样:
retrievedIO = StringIO.new( retrieved )
tempfile.write( retrievedIO.read( 1024 ) ) until retrievedIO.eof?

关于ruby - Errno::EINVAL 无效参数@io_fread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43726885/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com