gpt4 book ai didi

ruby - 创建导致垃圾回收问题的 Ruby 时间对象

转载 作者:数据小太阳 更新时间:2023-10-29 08:54:03 25 4
gpt4 key购买 nike

我是一个绝对的新手,甚至没有计算机科学背景。我只是一名机械工程师,试图实现一种方法来远程监控我们安装的太阳能发电系统中逆变器的功率输出(和其他输出数据)。所以,如果我说了什么非常愚蠢的话,我提前道歉。

我正在尝试编写一个小的 ruby​​ 程序,它将存在于我的 ror 网站的数据库文件夹中。每 15 分钟(只要系统在线产生能量),我希望它轮询来 self 们客户逆变器的数据(通过 TCPSocket 连接到连接到客户逆变器的网关)并使用新数据更新我网站的数据库文件.我的循环看起来像这样:

last_min = Time.new.min

while(1) do

tsec = Time.new.sec
tmin = Time.new.min

if ( ( tsec == 0 ) && ( tmin - last_min == 1 ) ) # test using one minute
# poll inverters, update database
last_min = tmin
end

end

当我第一次运行它时,它抛出了一个 Segmentation Fault 错误。然后我将 GC.disable 放在最上面,它工作正常(直到我在几分钟后才强制退出),但这只是为了看看它是否是一个垃圾收集问题,它确实是这样似乎是第一次创建触发问题的时间对象(抛出段错误)。我知道我显然不能为无限循环禁用垃圾收集。但是我如何用 ruby “清理自己”?我可以在每次循环运行结束时以某种方式释放那些时间对象吗?我看到一篇关于 GC.start 的帖子,但不太明白它是如何工作的。

还有没有一种方法可以运行我的程序并查看它在运行时使用了多少 RAM?我将不胜感激任何人可以在这里提供给我的所有建议。 (包括关于我在开头描述的太阳能输出监控系统的总体架构的建议!)

到目前为止,我已经从阅读这里的所有帖子中受益匪浅,在此先感谢您!

最佳答案

要强制进行垃圾回收,只需在循环结束时调用 GC.start。任何可以被垃圾收集的东西都会被垃圾收集。

话虽如此,如果您真的只是想要一个无限循环每分钟(或 15 分钟)做某事,而不是比较 Time.now 分钟和秒,只需调用 sleep在你的无限循环中。

loop do
poll_inverters_and_update_db
sleep 60
end

由于您提到您正在使用 Rails,您可能还想查看 delayed_job 以执行此类操作,或者只是设置一个 cron 作业以每 n 分钟执行一次。

关于ruby - 创建导致垃圾回收问题的 Ruby 时间对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5970102/

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