为内存密集型程序提高ruby速度
我正在用ruby运行一个相当内存密集的程序,它一开始很快,然后随着内存利用率的增加而变慢 该程序分为两个阶段:(1)在内存中构建一个大的为内存密集型程序提高ruby速度,ruby,performance,memory,Ruby,Performance,Memory,我正在用ruby运行一个相当内存密集的程序,它一开始很快,然后随着内存利用率的增加而变慢 该程序分为两个阶段:(1)在内存中构建一个大的hash:string=>list,(2)对hash进行一些计算。减速发生在第一阶段 为什么会发生这种情况?是不是有更多的调用垃圾收集器?或者ruby正在将内存交换到磁盘 在这两种情况下,是否有任何配置可以加快速度?例如,我可以增加堆大小或ruby允许消耗的最大内存量吗?我在手册页中没有看到任何内容。我发现ruby在处理大型数据集时也非常慢,我处理它的方法是运行
hash:string=>list
,(2)对hash进行一些计算。减速发生在第一阶段
为什么会发生这种情况?是不是有更多的调用垃圾收集器?或者ruby正在将内存交换到磁盘
在这两种情况下,是否有任何配置可以加快速度?例如,我可以增加堆大小或ruby允许消耗的最大内存量吗?我在手册页中没有看到任何内容。我发现ruby在处理大型数据集时也非常慢,我处理它的方法是运行ruby 1.9.2或更高版本,如果可能的话甚至运行jruby。如果这还不够的话,在遍历非常大的数据集时,我通常会回到mapreduce范式,这样我一次只需要在内存中保留一行。对于与构建哈希类似的问题,我只需要一个ruby程序emit to$stdout来链接或将输出转移到一个文件:
$ ruby build_csv.rb > items.csv
$ cat items.csv
foo,23
foo,17
bar,42
然后有第二个程序可以将数据结构读入散列
@hsh = Hash.new { |hash, key| hash[key] = [] }
File.open("items.csv").each_line do |l|
k,v = l.split(',')
@hsh[k] << v
end
将一个问题拆分为许多小程序确实会对速度产生影响,因为内存中保存的数据较少,如果对散列的操作只需要处理一个键,那么很容易将该部分编写为只需读取直到找到一个新键,在最后一个键上生成输出,然后继续使用新键,和第一轮差不多。通过拆分并在文件上生成中间结果来降低内存使用,这确实大大加快了处理过程。如果可以分割数据,还可以在shell中或通过使用线程一次运行多个第一阶段/映射作业。如果提供更多细节,您可能会得到更好的答案。例如,你的操作系统是否说你在寻呼?@David Nehme——我如何检查我的操作系统是否说我在寻呼?我在OSX上。
@hsh => {"foo"=>[23, 17], "bar"=>[42]}