我有一个ruby脚本来处理类似这样的S3日志:
AWS::S3::Bucket.find(data_bucket).logs.each do |s3log|
s3log.lines.each do |line|
# accumulate stuff
end
end
但是,在aws / s3 gem中:行访问器会记住数据。因此,当我处理每个文件时,内存会增长。
除了黑客攻击gem,限制文件读取每次运行,和/或经常运行脚本,我怎样才能优雅地避免可能增长到几gb的ruby进程?我错过了内存管理技巧吗?
答案 0 :(得分:0)
这个的根源是Bucket.objects
,这是Bucket.logs
使用的,它保留了@object_cache
中所有对象的引用。线路缓存是一个辅助问题。
解决方案:我只使用两个循环:内部循环一次从S3
10获取日志,外部循环处理直到is_truncated
为假。这意味着我们永远不会一次引用超过10个S3
个日志文件,而且我的内存问题也就消失了。