2010-09-10 3 views
3

Je reçois un: message 'ArgumentError taille du tableau trop grand' avec le code suivant:taille Array trop grand - rubis

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

question. Quelle est la valeur maximale que prend la fonction Array.new dans Ruby?

+0

'NoMemoryError: échec de l'allocation de mémoire' ici. Quel ruby ​​utilisez-vous? – Reactormonk

+0

Ruby 1.8.6 sur Textmate. –

+0

Pourquoi voulez-vous faire pleurer Ruby? :) "Array.new (100_000_000) && false" semble fonctionner assez vite. –

Répondre

11

Un tableau avec 500 millions d'éléments est 2 GiBytes de taille, qui   – en fonction du système d'exploitation spécifique vous utilisez   – est typiquement au maximum qu'un processus peut traiter. En d'autres termes: votre tableau est plus grand que votre espace d'adressage. Ainsi, les solutions sont évidentes: soit réduire la taille de la matrice (par exemple, la diviser en morceaux), soit augmenter l'espace d'adressage (sous Linux, vous pouvez patcher le noyau pour obtenir 3, 3.5 et même 4). GiByte d'espace d'adressage, et bien sûr passer à un OS 64 bits et une implémentation Ruby 64 bits (!) Fonctionnerait également).

Vous avez également besoin de repenser votre approche. Peut-être utiliser mmap au lieu d'un tableau, ou quelque chose comme ça. Peut-être paresseux-ne charge que les pièces dont vous avez besoin.

+0

Merci. Yup, travaillant sur un algorithme de chargement paresseux pour résoudre le problème. –

+0

Cela signifie-t-il qu'un tableau de 4 Ko conviendrait à 2 000 entiers? – mbigras

Questions connexes