为Rails获取错误"无法分配内存"

 手机用户2602890681 发布于 2023-02-13 10:30

在我的项目中,有一个脚本返回我必须在表格中显示的产品列表.

存储我使用的脚本的输入IO.popen:

@device_list = []
IO.popen("device list").each do |device|
  @device_list << device
end

device list 是给我产品列表的命令.

@device_list通过迭代将数组返回到我的视图中进行显示.

当我运行它时,我收到一个错误:

Errno::ENOMEM (Cannot allocate memory):
for IO.popen

我有另一个脚本device status只返回true和false但我得到了同样的错误:

def check_status(device_id)        
    @stat = system("status device_id")
    if @stat == true
         "sold"
    else
         "not sold"
    end
  end

我该怎么办?

1 个回答
  • 两者IO.popen并且Kernel#system在内存方面可能是昂贵的操作,因为它们都依赖于fork(2).Fork(2)是一个Unix系统调用,它创建一个子进程来克隆父进程的内存和资源.这意味着,如果您的父进程使用500mb的内存,那么您的孩子也将使用500mb的内存.每次执行Kernel#system或者IO.popen增加应用程序的内存使用量时,运行Rails应用程序所需的内存量.

    如果您的开发机器有比生产服务器更多的RAM,或者您的生产服务器产生更多输出,那么您可以做两件事:

      增加生产服务器的内存.

      使用Resque之类的东西做一些内存管理.

    您可以使用Resque将这些操作排入作业.然后,Resque将生成"workers"/子进程以从队列中获取作业,对其进行处理然后退出.Resque仍然分叉,但重要的是工作人员在完成任务后退出以释放内存.每次工作人员完成工作时,内存都会出现峰值,但每次工作后都会返回到应用程序的基线内存.

    您可能必须执行上述两个选项,并寻找其他方法来最小化应用程序的内存使用量.

    2023-02-13 10:33 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有