arrays - 在 Ruby 中将数组破坏性地转换为数组

标签 arrays ruby memory

假设我有两个相当大的数组,ab

我想要b=a+b,但之后我真的不需要a,更愿意保存内存,以避免交换。

我考虑过简单地使用:

b.unshift( *a.slice!(0..-1) )

但是上面的缺点是在过程完成之前仍然保留 a 的副本。另一种选择是:

while ! a.empty?() do 
       b.unshift( a.pop() )
end

虽然不优雅,甚至可能更慢(这是迭代,我不知道 * 运算符的工作速度有多快,也许它处于较低级别),这使中间内存占用量保持在最低限度。

还有更优雅的东西吗?

最佳答案

不能保证分配给 a 的内存会因为您删除了所有元素而被释放。大多数动态数组系统会随着数组大小的增加而进行分配,这是非常必要的,但在减小大小时会更加轻松。

最好的方法是执行 b += a,让 a 超出范围,然后让垃圾收集器对其进行排序。

除非您可以生成一个具体的基准来表明您的复杂方法效果更好,否则它可能不会因为 splat 操作将创建需要收集的额外垃圾,否则您应该做最简单的事情。

关于arrays - 在 Ruby 中将数组破坏性地转换为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49406072/

相关文章:

c++ - 使用 Qt 表单中按顺序命名的 ui 对象填充数组

c - 解码这些 Valgrind 调试器内存错误在我的代码中意味着什么

arrays - Perl:如何正确初始化散列或数组

C : uninitialized char pointer and print out the address

R 尽管内存似乎可用,但无法分配内存

memory - 内存地址通常以位为单位多长时间

c - 在 C 中定义一个全局结构指针?

arrays - 修改 Ruby 方法以将整数分区表示为有序字符串(不展平?)

mysql - 将 Ruby Mysql 查询转换为变量

ruby - RSpec - 无法 stub 类私有(private)方法