Limites pratiques du bloc de données R

J’ai lu sur la façon dont read.table n’est pas efficace pour les gros fichiers de données. Aussi, comment R n’est pas adapté aux grands ensembles de données. Je me demandais donc où je pouvais trouver quelles sont les limites pratiques et les tableaux de performances pour (1) Lecture de données de différentes tailles (2) travaillant avec des données de tailles différentes.

En effet, je veux savoir quand la performance se détériore 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 performance spéciale pour Rcpp et RInside, ce serait génial!

    R est adapté aux grands ensembles de données, mais vous devrez peut-être modifier votre façon de travailler plutôt que ce que vous apprennent les manuels d’introduction. J’ai publié un article sur Big Data pour R qui affiche un dataset de 30 Go et que vous pouvez trouver utile pour vous inspirer.

    Les sources d’information habituelles sont la vue des tâches de calcul haute performance et la liste de diffusion R-SIG HPC de R-SIG HPC .

    La limite principale que vous devez contourner est une limite historique sur la longueur d’un vecteur à 2 ^ 31-1 éléments qui ne serait pas si grave si R ne stockait pas les masortingces en tant que vecteurs. (La limite est la compatibilité avec certaines bibliothèques BLAS.)

    Nous analysons régulièrement les enregistrements de données d’appels téléphoniques et les bases de données marketing avec plusieurs millions de clients utilisant R, et nous serions heureux de vous en parler si cela vous intéresse.

    Les limites physiques découlent de l’utilisation d’index 32 bits sur les vecteurs. En conséquence, les vecteurs jusqu’à 2 ^ 31 – 1 sont autorisés. Les masortingces sont des vecteurs de dimensions, donc le produit de nrow(mat) et ncol(mat) doit être compris entre 2 ^ 31 – 1. Les ncol(mat) données et les listes sont des vecteurs généraux, donc chaque composant peut prendre 2 ^ 31 – 1 les trames de données signifient que vous pouvez avoir autant de lignes et de colonnes. Pour les listes, vous pouvez avoir 2 ^ 31 – 1 composants, chacun de 2 ^ 31 – 1 éléments. Ceci est tiré d’une publication récente de Duncan Murdoch en réponse à un Q sur R-Help

    Maintenant, tout doit tenir dans la mémoire vive avec la norme R, ce qui peut être une limite plus pressante, mais la vue des tâches de calcul haute performance que d’autres ont mentionnée contient des détails sur les paquets pouvant contourner les problèmes de mémoire.

    1) Le manuel R Import / Export devrait être le premier sharepoint contact pour les questions concernant 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 particulier, read.table a considérablement amélioré les performances si les options qui lui sont fournies sont utilisées, en particulier colClasses , comment.char et nrows – car ces informations doivent être déduites des données elles-mêmes, ce qui peut être coûteux.

    2) Il y a une limite spécifique pour la longueur (nombre total d’éléments) pour tout vecteur, masortingce, tableau, colonne dans un data.frame ou une liste. Cela est dû à un index de 32 bits utilisé sous le capot et est vrai pour les modèles 32 bits et 64 bits. Le nombre est 2 ^ 31 – 1. Il s’agit du nombre maximal de lignes pour un data.frame, mais Il est si grand que vous risquez de manquer de mémoire, même pour un seul vecteur, avant de commencer à en collecter plusieurs.

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

    Un seul vecteur de cette longueur prendra plusieurs 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 que ce soit une limite correcte à moins que vous ne poussiez vraiment les choses. Si vous devez vraiment dépasser les limites de la mémoire système disponible (64 bits est obligatoire ici), les techniques de firebase database standard décrites dans le manuel d’importation / exportation ou les options de fichiers mappés en mémoire (comme le package ff ) méritent d’être sockets en compte. Le calcul des tâches hautes performances de CRAN Task View est une bonne ressource pour cette fin.

    Enfin, si vous avez des stacks de RAM (16 Go ou plus) et que vous avez besoin d’une indexation 64 bits, cela pourrait se produire dans une prochaine version de R. http://www.mail-archive.com/r-help@r-project.org /msg92035.html

    En outre, Ross Ihaka discute de certaines décisions historiques et orientations futures pour une langue de type R dans les communications et les exposés: http://www.stat.auckland.ac.nz/~ihaka/?Papers_and_Talks

    Je ne peux répondre qu’à celui concernant read.table , car je n’ai aucune expérience avec des ensembles de données volumineux. read.table fonctionne mal si vous ne fournissez pas d’arguments colClasses . Sans elle, read.table défaut NA et essaie de deviner une classe de chaque colonne, ce qui peut être lent, en particulier lorsque vous avez beaucoup de colonnes.

    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. install.packages("data.table", repos="http://R-Forge.R-project.org")

    Vous gagnez habituellement un facteur de 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 vous recommande d’utiliser le package parallel (dans le cadre de la R.2.14) pour charger un fichier par cœur.

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