使用Ruby将范围转换为数组并耗尽内存

使用Ruby将范围转换为数组并耗尽内存,ruby,memory-management,heap-memory,Ruby,Memory Management,Heap Memory,我正在做一些一开始看起来很简单的事情 Ruby代码: (0...693530740).to_a 这导致 NoMemoryError: failed to allocate memory 我被难倒了。有没有办法改变ruby解释器可以使用多少内存?我不知道怎么做。我没有办法解决这个问题,因为它必须存在于我的代码中。有更好的办法吗?是否有一种较低级别的语言可以做到这一点?欢迎提出任何意见。我已经尝试过使用jRuby并为jvm提供15GB内存,但没有成功 感谢您阅读此问题为什么需要创建包含数亿项的数

我正在做一些一开始看起来很简单的事情

Ruby代码:

(0...693530740).to_a
这导致

NoMemoryError: failed to allocate memory
我被难倒了。有没有办法改变ruby解释器可以使用多少内存?我不知道怎么做。我没有办法解决这个问题,因为它必须存在于我的代码中。有更好的办法吗?是否有一种较低级别的语言可以做到这一点?欢迎提出任何意见。我已经尝试过使用jRuby并为jvm提供15GB内存,但没有成功


感谢您阅读此问题

为什么需要创建包含数亿项的数组?您真的需要同时在内存中存储所有这些项吗,或者您可以逐个处理它们,允许对已处理的项进行垃圾收集?大概是这样的:

(0...693530740).each do |n|
  # do something
end

为什么需要创建一个包含数亿项的阵列?您真的需要同时在内存中存储所有这些项吗,或者您可以逐个处理它们,允许对已处理的项进行垃圾收集?大概是这样的:

(0...693530740).each do |n|
  # do something
end

因此,您需要分配一个具有约6.5亿个数字的数组。约为2.6GB。请注意,此内存必须是连续的。在不知道您有多少物理内存的情况下,我认为这是您无法执行此操作的主要原因

因此您希望分配一个具有约6.5亿个数字的数组。约为2.6GB。请注意,此内存必须是连续的。在不知道你有多少物理内存的情况下,我认为这是你不能这么做的主要原因

“我没有办法解决这个问题,因为它必须存在于我的代码中”

修改你的代码,这样你就不需要它了。这里只有一条有意义的数据,数字
693530740
,正好可以容纳8个字节。您不太可能真的需要将其扩展到那个巨大的阵列中。您可能认为需要的大多数Ruby数组方法都具有等价物(使用
Range
Enumerator
),无需实例化这样的数字列表即可工作

如果您很难看到什么样的重新设计可以避免大型阵列,那么就在这里发布一个新的问题——如果设计可以用简短的描述和几行代码来概括,那么就在堆栈溢出上。如果无法用一小段代码演示您的算法,请访问codereview.stackexchange.com

“我没有办法解决这个问题,因为它必须存在于我的代码中”

修改你的代码,这样你就不需要它了。这里只有一条有意义的数据,数字
693530740
,正好可以容纳8个字节。您不太可能真的需要将其扩展到那个巨大的阵列中。您可能认为需要的大多数Ruby数组方法都具有等价物(使用
Range
Enumerator
),无需实例化这样的数字列表即可工作


如果您很难看到什么样的重新设计可以避免大型阵列,那么就在这里发布一个新的问题——如果设计可以用简短的描述和几行代码来概括,那么就在堆栈溢出上。如果无法用一小段代码演示您的算法,请访问codereview.stackexchange.com

为什么要将其作为数组?你不能试着枚举它吗?为什么你要它作为一个数组?你不能试着列举一下吗?你完全正确。只是因为后来的其他代码依赖于数组,所以看起来必须这样。我本不该这么说的。重构。谢谢你完全正确。只是因为后来的其他代码依赖于数组,所以看起来必须这样。我本不该这么说的。重构。谢谢