数组大小过大 - Ruby

6
我用以下代码遇到了“ArgumentError: array size too big”的错误信息:
MAX_NUMBER = 600_000_000
my_array = Array.new(MAX_NUMBER)

问题. Ruby中Array.new函数的最大值是多少?

在这里出现了“无法分配内存”的错误。你使用的是哪个版本的Ruby? - Reactormonk
你为什么想让Ruby哭泣? :) "Array.new(100_000_000) && false" 似乎运行得相当快。 - Jason Noble
没错,当我将MAX_NUMBER设置为500_000_000时,它对我来说运行得很好 - 虽然需要五分钟才能完成。但是,这并没有解决我正在处理的主要问题。我想我还需要重新考虑我的解决方案。 - Prakash Murthy
1个回答

16

一个包含 5 亿个元素的数组大小为 2 GiBytes,这通常是进程可以寻址的最大内存空间,具体取决于您使用的操作系统。换句话说:您的数组比您的地址空间还要大。

因此,解决方案很明显:要么缩小数组(例如,通过将其分成块),要么扩大地址空间(在 Linux 中,您可以打补丁来获得 3、3.5 甚至 4 GiByte 的地址空间,当然,切换到 64 位操作系统和 64 位 Ruby 实现(!)也可以解决问题)。

或者,您需要重新考虑方法。也许使用 mmap 而不是数组,或者类似于此的东西。也许只有在需要时才延迟加载部分内容。


谢谢。是的,我正在开发一个懒加载算法来解决这个问题。 - Prakash Murthy
这是否意味着一个4KB的数组可以容纳2000个整数? - mbigras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接