2012-05-17 26 views
28

De acuerdo con la documentación R 'Memory-limits', no es posible asignar un vector de longitud superior a 2^31-1. Esto se debe a que el número entero utilizado como índice solo puede usar 31 bits (un bit para el signo). Pero en un sistema de 64 bits, debería ser capaz de asignar vectores más largos. ¿Por qué R impone esta misma longitud máxima en sistemas de 64 bits? ¿Hay alguna manera de eludir el límite?Longitud máxima para un vector en R

+7

Tenga en cuenta que este límite se eliminó en R-3.0.0. –

Respuesta

24

Si está dispuesto a trabajar con la versión de desarrollo de R, puede tener experimental compatible con esta función. De http://stat.ethz.ch/R-manual/R-devel/doc/html/NEWS.html:

VECTORES DE LARGO

Hay los inicios de apoyo para los vectores de más de 2^31 - 1 elementos en plataformas de 64 bits. Esto se aplica a los vectores crudos, lógicos, enteros, dobles, complejos y de caracteres, así como a las listas. (Los elementos de los vectores de caracteres permanecen limitados a 2^31 - 1 bytes).

Todos los aspectos son actualmente experimentales.

Lo que se puede hacer con tales vectores actualmente es algo limitado, y la mayoría de las operaciones devolverá el error 'vectores largos no admitidos todavía'. Se pueden serializar y deserializar, coercion, identico() y object.size() el trabajo y los medios se pueden calcular. Sus longitudes pueden ser obtener y establecer por xlength(): la longitud de llamada() en un vector largo arrojará un error.

La mayoría de los aspectos de indexación están disponibles. Generalmente, los índices de doble valor se pueden usar para acceder a elementos que van más allá de 2^31 - 1.

Consulte el enlace para obtener más información. No he experimentado con esto en absoluto, así que no puedo comentar si todavía es útil o no.

Si va a http://developer.r-project.org/R_svnlog_2011 (y http://developer.r-project.org/R_svnlog_2012) y busca "vectores largos", puede hacerse una idea del trabajo que está sucediendo.

+6

Gran sugerencia para escanear a través del registro svn. Ver que es esencialmente "ripley, ripley, ripley, ..." quien está haciendo el trabajo me recuerda a [esta publicación] (http://dirk.eddelbuettel.com/blog/2007/08/11/) desde atrás en el día. –

15

Aquí hay más detalles que complementarán la respuesta de Ben. Las limitaciones parecen heredarse de los lenguajes de programación de nivel inferior utilizados para construir R, especialmente (aparentemente) el código FORTRAN. Entonces, obviamente, la transición de R para que pueda aprovechar al máximo los sistemas de direccionamiento de 64 bits va a ser un proyecto importante.

Desde el R-admin manual:

Incluso en 64 bits construye de R existen límites en el tamaño de los objetos R (consulte la ayuda ("Memory-límites"), algunos de los cuales se derivan de la utilización de Enteros de 32 bits (especialmente en el código FORTRAN). En todas las compilaciones de R, la longitud máxima (número de elementos) de un vector es 2^31-1, alrededor de 2 mil millones, y en compilaciones de 64 bits del tamaño de un bloque de la memoria asignada está limitada a 2^34-1 bytes (8GB). Se prevé que se levantarán eventualmente * pero la necesidad de objetos de 8GB es (cuando esto fue escrito en 2011) excepcional.

(También hay una nota al pie irónica en el manual, donde puse un *, señalando que "este comentario ha estado en el manual desde 2005". :)

Cuestiones relacionadas