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.
'NoMemoryError: échec de l'allocation de mémoire' ici. Quel ruby utilisez-vous? – Reactormonk
Ruby 1.8.6 sur Textmate. –
Pourquoi voulez-vous faire pleurer Ruby? :) "Array.new (100_000_000) && false" semble fonctionner assez vite. –