2010-09-10 66 views
3

我得到一个“引发ArgumentError:阵列尺寸过大”的消息,下面的代码:数组大小太大 - 红宝石

MAX_NUMBER = 600_000_000 
my_array = Array.new(MAX_NUMBER) 

问题。什么是Array.new函数在Ruby中的最大值?

+0

'NoMemoryError:未能分配内存'在这里。你在用什么红宝石? – Reactormonk 2010-09-10 19:01:44

+0

在Textmate上的红宝石1.8.6。 – 2010-09-10 19:09:59

+0

你为什么想让Ruby哭? :)“Array.new(100_000_000)&& false”似乎运行得有些快。 – 2010-09-10 19:21:23

回答

11

用500个百万个元素的数组是在大小为2个GiBytes,其  –取决于所使用  –特定OS上通常是最大进程可以解决。换句话说:你的数组比你的地址空间大。因此,解决方案是显而易见的:要么减小数组的大小(通过大块分割),要么增大地址空间(在Linux中,可以修补内核以获得3,3.5,甚至4 GiByte的地址空间,当然也可以切换到64位操作系统 64位Ruby实现(!)也可以)。

或者,您需要重新考虑您的方法。也许使用mmap而不是数组,或者类似的东西。也许延迟只加载你需要的部分。

+0

谢谢。是的,工作在一个懒惰的负载算法来解决这个问题。 – 2010-09-13 03:25:52

+0

这是否意味着一个4KB数组将适合2000个整数? – mbigras 2017-02-03 03:39:32