web-dev-qa-db-fra.com

Limites pratiques de la trame de données R

J'ai lu à quel point read.table n'est pas efficace pour les gros fichiers de données. De plus, la façon dont R ne convient pas aux grands ensembles de données. Je me demandais donc où trouver les limites pratiques et les graphiques de performances pour (1) lire des données de différentes tailles (2) travailler avec des données de tailles différentes.

En effet, je veux savoir quand les performances se dégradent et quand je frappe un barrage routier. Toute comparaison avec C++/MATLAB ou d'autres langages serait également très utile. enfin s'il y a une comparaison de performances spéciale pour Rcpp et RInside, ce serait génial!

49
Egon

R est adapté aux grands ensembles de données, mais vous devrez peut-être changer quelque peu votre façon de travailler par rapport à ce que les manuels d'introduction vous enseignent. J'ai fait un article sur Big Data for R qui croque un ensemble de données de 30 Go et que vous pourriez trouver utile pour l'inspiration.

Les sources habituelles d'informations pour commencer sont High-Performance Computing Task View et la liste de diffusion R-SIG HPC à R-SIG HPC .

La principale limite que vous devez contourner est une limite historique de la longueur d'un vecteur à 2 ^ 31-1 éléments, ce qui ne serait pas si mal si R ne stockait pas les matrices comme vecteurs. (La limite est pour la compatibilité avec certaines bibliothèques BLAS.)

Nous analysons régulièrement les enregistrements de données d'appels télécoms et les bases de données marketing avec plusieurs millions de clients à l'aide de R, nous serions donc heureux d'en parler davantage si vous êtes intéressé.

50
Allan Engelhardt

Les limites physiques résultent de l'utilisation d'index 32 bits sur les vecteurs. Par conséquent, les vecteurs jusqu'à 2 ^ 31 - 1 sont autorisés. Les matrices sont des vecteurs avec des dimensions, donc le produit de nrow(mat) et ncol(mat) doit être compris entre 2 ^ 31 - 1. Les blocs de données et les listes sont des vecteurs généraux, de sorte que chaque composant peut prendre 2 ^ 31 - 1 entrées, ce qui signifie que pour les trames de données, vous pouvez avoir autant de lignes et colonnes. Pour les listes, vous pouvez avoir 2 ^ 31 - 1 composants, chacun de 2 ^ 31 - 1 éléments. Ceci est tiré d'un récent affichage par Duncan Murdoch en réponse à un Q sur R-Help

Maintenant que tout doit tenir dans RAM avec R standard, ce qui pourrait être une limite plus pressante, mais le High-Performance Computing Task View que d'autres ont mentionné contient des détails de packages pouvant contourner les problèmes de mémoire.

29
Gavin Simpson

1) Le manuel R Import/Export devrait être le premier port d'escale pour les questions sur l'importation de données - il existe de nombreuses options et ce qui fonctionnera pour vous pourrait être très spécifique.

http://cran.r-project.org/doc/manuals/R-data.html

read.table A spécifiquement amélioré considérablement les performances si les options qui lui sont fournies sont utilisées, notamment colClasses, comment.char Et nrows - c'est parce que ces informations doivent être déduit des données elles-mêmes, ce qui peut être coûteux.

2) Il existe une limite spécifique pour la longueur (nombre total d'éléments) pour tout vecteur, matrice, tableau, colonne dans un data.frame ou une liste. Cela est dû à un index 32 bits utilisé sous le capot, et est vrai pour les 32 bits et 64 bits R. Le nombre est 2 ^ 31 - 1. C'est le nombre maximum de lignes pour un data.frame, mais il est si grand que vous risquez de manquer de mémoire, même pour des vecteurs uniques, avant de commencer à en collecter plusieurs.

Voir help(Memory-limits) et help(Memory) pour plus de détails.

Un seul vecteur de cette longueur prendra beaucoup de gigaoctets de mémoire (dépend du type et du mode de stockage de chaque vecteur - 17,1 pour le numérique), il est donc peu probable qu'il s'agisse d'une limite appropriée à moins que vous ne poussiez vraiment les choses. Si vous avez vraiment besoin de pousser les choses au-delà de la mémoire système disponible (64 bits est obligatoire ici), alors les techniques de base de données standard, comme indiqué dans le manuel d'importation/exportation, ou les options de fichiers mappés en mémoire (comme le package ff) , valent la peine d'être examinées. Le calcul de haute performance CRAN Task View est une bonne ressource pour cette fin de choses.

Enfin, si vous avez des piles de RAM (16 Go ou plus) et avez besoin d'une indexation 64 bits, cela pourrait venir dans une future version de R. http: //www.mail- archive.com/[email protected]/msg92035.html

En outre, Ross Ihaka discute de certaines des décisions historiques et des orientations futures pour un langage de type R dans des articles et parle ici: http://www.stat.auckland.ac.nz/~ihaka/?Papers_and_Talks

13
mdsumner

Je ne peux que répondre à celle sur read.table, car je n'ai aucune expérience avec les grands ensembles de données. read.table fonctionne mal si vous ne fournissez pas d'arguments colClasses. Sans ça, read.table par défaut est NA et essaie de deviner une classe de chaque colonne, ce qui peut être lent, surtout lorsque vous avez beaucoup de colonnes.

8
aL3xa

Lors de la lecture de gros fichiers csv x GB <=> y.1e6 rows Je pense que data.table::fread (À partir de la version 1.8.7) est l'alternative la plus rapide que vous pouvez faire faire install.packages("data.table", repos="http://R-Forge.R-project.org")

Vous gagnez généralement un facteur 5 à 10 (et tous les sep, row.names Etc. sont traités par la fonction elle-même). Si vous avez beaucoup de fichiers et un ordinateur suffisamment décent (plusieurs cœurs), je recommande d'utiliser le package parallel (dans le cadre de R.2.14) pour charger un fichier par cœur.

La dernière fois que j'ai fait cela entre le chargement monothread avec read.csv Et le multithread sur 4 cœurs utilisation de fread je suis passé de 5 minutes à 20 secondes

7
statquant