gpt4 book ai didi

ruby - 雾 gem 泄漏内存

转载 作者:太空宇宙 更新时间:2023-11-03 16:25:19 24 4
gpt4 key购买 nike

我已经编写了一个脚本来通过我的 Rackspace 云文件容器递归下载并检索每个文件的副本,所以我有一个本地备份以防 Rackspace 被 meteor 和/或 hindenbugs 击中。

但是,我的脚本在下载我的文件时显然以线性比例泄漏内存。

基本上我有一个看起来像这样的方法:

def download_file(fog_file, destination_path)
data = fog_file.body
File.open(destination_path, 'w') { |f| f.write(data) }
end

我知道由于 Fog 的性质,我无法避免将整个文件加载到内存中,但我可以想象 Ruby 会在每个 download_file 之后释放内存(或有能力释放内存) > 调用。毕竟,data 变量超出了范围。

不幸的是,当我查看我的系统监控时,内存使用量一直以线性速度增加,直到它耗尽我所有的可用内存,此时脚本崩溃。

我在这里做错了什么?

我在 Ubuntu 上使用 Ruby 2.1.2。

最佳答案

您可以通过两种方式避免将整个文件加载到内存中。

首先,您可以检索 100kb(或更小)的文件:

service = Fog::Storage.new({ provider: 'Rackspace', 
# ... auth config
connection_options: {chunk_size: 102_400} # 100 KB in bytes
})

directory = service.directories.get "dir"

File.open((destination_path, 'w') do | f |
directory.files.get("my_file_on_cloud.png") do | data, remaining, content_length |
f.syswrite data
end
end

其次,您可以使用 fog 检索文件 url,然后使用 OpenUri 下载并保存文件:

require 'open-uri'

file = open(file.public_url).read
File.open(destination_path, 'w') { |f| f.write(file) }

第一种方法直接写入目标文件,第二种方法创建一个 Tempfile 实例(在文件系统上创建一个临时文件)。两种都试试。

关于ruby - 雾 gem 泄漏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25922821/

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