你如何在Ruby中找到机器上的物理内存?

时间:2010-10-27 01:47:17

标签: ruby memory

我想知道系统上有多少物理内存,不包括任何交换。有没有一种方法可以在Ruby中获取这些信息?

6 个答案:

答案 0 :(得分:10)

如果您使用的是Linux,通常使用“free”命令查找物理内存,即系统上的RAM详细信息

 output = %x(free)

输出看起来会像下面的字符串

" total used free shared buffers cached\nMem: 251308 201500 49808 0 3456 48508\n-/+ buffers/cache: 149536 101772\nSwap: 524284 88612 435672\n"

您可以使用简单的字符串操作(如

)提取所需的信息

output.split(" ")[7]会给出总记忆力 output.split(" ")[8]会给出用尽的记忆 output.split(" ")[9]将提供免费记忆

答案 1 :(得分:4)

AndrewKS的答案略显光滑的版本:

total_memory_usage_in_k = `ps -Ao rss=`.split.map(&:to_i).inject(&:+)

答案 2 :(得分:3)

嗯,Unix命令“top”似乎在Ruby中不起作用,所以试试这个:

# In Kilobytes
memory_usages = `ps -A -o rss=`.split("\n")
total_mem_usage = memory_usages.inject { |a, e| a.to_i + e.strip.to_i }

这“似乎”是正确的。我不保证。此外,这需要比系统更多的时间,所以当它完成时,物理内存会发生变化。

答案 3 :(得分:3)

您可以使用此gem获取各种系统信息http://threez.github.com/ruby-vmstat/

答案 4 :(得分:1)

这可以回答Ruby和Bash,也可能是Python和其他人的答案:

#!/usr/bin/env bash 
# This file is in public domain. 
# Initial author: martin.vahi@softf1.com

#export S_MEMINFO_FIELD="Inactive"; \
export S_MEMINFO_FIELD="MemTotal"; \
ruby -e "s=%x(cat /proc/meminfo | grep $S_MEMINFO_FIELD: | \
gawk '{gsub(/MemTotal:/,\"\");print}' | \
gawk '{gsub(/kB/,\"*1024\");print}' | \
gawk '{gsub(/KB/,\"*1024\");print}' | \
gawk '{gsub(/KiB/,\"*1024\");print}' | \
gawk '{gsub(/MB/,\"*1048576\");print}' | \
gawk '{gsub(/MiB/,\"*1048576\");print}' | \
gawk '{gsub(/GB/,\"*1073741824\");print}' | \
gawk '{gsub(/GiB/,\"*1073741824\");print}' | \
gawk '{gsub(/TB/,\"*1099511627776\");print}' | \
gawk '{gsub(/TiB/,\"*1099511627776\");print}' | \
gawk '{gsub(/B/,\"*1\");print}' | \
gawk '{gsub(/[^1234567890*]/,\"\");print}' \
); \
s_prod=s.gsub(/[\\s\\n\\r]/,\"\")+\"*1\";\
ar=s_prod.scan(/[\\d]+/);\
i_prod=1;\
ar.each{|s_x| i_prod=i_prod*s_x.to_i};\
print(i_prod.to_s+\" B\")"

这里需要注意的是,行末尾的“\”是Bash行的延续。基本上它应该都是单线程,除了必须删除的超出注释的行。

末尾的冒号
grep $S_MEMINFO_FIELD:

很重要,因为

cat /proc/meminfo | grep Inactive

打印多行,但脚本的其余部分假设grep只输出一行。根据

https://unix.stackexchange.com/questions/263881/convert-meminfo-kb-to-bytes

/ proc / meminfo使用1024,无论单位是“kB”还是“KB”。我没有关于GiB,GB和TB部分的任何信息,但我认为它们遵循相同的风格,1MB = 1024 * 1024KiB。

我创建了一个Linux特定的Bash脚本,它将/ proc / meminfo字段名称作为其1.命令行参数,并以字节打印出值:

http://longterm.softf1.com/2016/comments/stackoverflow_com/2016_03_07_mmmv_proc_meminfo_filter_t1.bash

(档案副本:https://archive.is/vjcNf

感谢您阅读我的评论。 我希望它有所帮助。 : - )

答案 5 :(得分:0)

您可以使用total宝石(我是作者):

require 'total'
puts Total::Mem.new.bytes