Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为内存密集型程序提高ruby速度_Ruby_Performance_Memory - Fatal编程技术网

为内存密集型程序提高ruby速度

为内存密集型程序提高ruby速度,ruby,performance,memory,Ruby,Performance,Memory,我正在用ruby运行一个相当内存密集的程序,它一开始很快,然后随着内存利用率的增加而变慢 该程序分为两个阶段:(1)在内存中构建一个大的hash:string=>list,(2)对hash进行一些计算。减速发生在第一阶段 为什么会发生这种情况?是不是有更多的调用垃圾收集器?或者ruby正在将内存交换到磁盘 在这两种情况下,是否有任何配置可以加快速度?例如,我可以增加堆大小或ruby允许消耗的最大内存量吗?我在手册页中没有看到任何内容。我发现ruby在处理大型数据集时也非常慢,我处理它的方法是运行

我正在用ruby运行一个相当内存密集的程序,它一开始很快,然后随着内存利用率的增加而变慢

该程序分为两个阶段:(1)在内存中构建一个大的
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]}