Options d'analyse de données hors cœur

18

J'utilise SAS professionnellement depuis près de 5 ans maintenant. Je l'ai installé sur mon ordinateur portable et je dois fréquemment analyser des ensembles de données avec 1 000 à 2 000 variables et des centaines de milliers d'observations.

Je cherchais des alternatives à SAS qui me permettent de réaliser des analyses sur des ensembles de données de taille similaire. Je suis curieux de savoir ce que les autres utilisent pour des situations comme celle-ci. Ce n'est certainement pas du "Big Data" de la manière qui est utilisée aujourd'hui. Mes jeux de données ne sont pas non plus suffisamment petits pour être conservés en mémoire. J'ai besoin d'une solution capable d'appliquer des algorithmes aux données stockées sur un disque dur. Ce sont les choses que j'ai enquêtées en vain:

  1. R - BigMemory peut créer des matrices stockées hors mémoire, mais les éléments doivent être du même mode. Je travaille avec des données qui sont presque un partage 50/50 entre le caractère et le numérique. Le package FF se rapproche de ce dont j'ai besoin, mais je ne comprends pas très bien quelles procédures sont compatibles avec lui. Je pense que le soutien est quelque peu limité.
  2. Pandas - J'étais très enthousiasmé par une alternative pythonique à R. Cependant, il doit aussi conserver toutes les données en mémoire.
  3. Revolution R - Celui-ci est assez prometteur. J'ai une copie sur mon ordinateur personnel (gratuite si vous vous inscrivez à Kaggle) et je ne l'ai pas encore testée comme alternative viable à SAS. Les commentaires sur Revolution R en tant qu'alternative SAS sont très appréciés.

Merci

MISE À JOUR 1

Modification pour ajouter que je recherche des solutions pratiques et réelles que les gens ont utilisées avec succès. Pour la plupart, SAS me permet de parcourir de gros fichiers sans se soucier un peu des contraintes de mémoire. Quelle que soit la manière dont SAS est implémenté, ils ont compris comment rendre la gestion de la mémoire transparente pour l'utilisateur. Mais, c'est le cœur lourd que j'ai utilisé SAS pour mon travail (je le dois) et j'AIMERAIS une alternative FOSS qui me permet de travailler sur de "grandes" données sans avoir à trop réfléchir à l'endroit où se trouvent les données à un heure spécifique (en mémoire ou sur disque).

Les choses les plus proches que j'ai rencontrées sont le package FF de R et quelque chose à l'horizon pour Python appelé Blaze . Et pourtant, ces problèmes existent depuis de nombreuses années, alors qu'ont fait les analystes entre-temps? Comment gèrent-ils ces mêmes problèmes avec les limites de mémoire? La majorité des solutions proposées semblent être:

  • Obtenez plus de RAM - Ce n'est pas une bonne solution, imo. Il est facile de trouver un ensemble de données qui peut dépasser la RAM tout en pouvant tenir sur un disque dur. De plus, le flux de travail doit s'adapter à toutes les structures créées lors de l'analyse exploratoire des données.
  • Sous-ensemble des données - C'est bien pour l'exploration mais pas pour finaliser les résultats et les rapports. Finalement, tous les processus développés sur un sous-ensemble devront être appliqués à l'ensemble de données (dans mon cas, de toute façon).
  • Chunk through the data - C'est ce que j'aimerais en savoir plus sur les personnes qui mettent réellement en œuvre ce flux de travail. Comment est-il fait? Avec quels outils? Peut-il être fait d'une manière transparente pour l'utilisateur? (c.-à-d., créer une structure de données sur disque et le cadre se charge de la segmentation sous le capot).
Zelazny7
la source
1
Les nouvelles versions de Stata sur les machines 64 bits n'ont aucun problème avec les ensembles de données de cette taille (car 5 Go s'intègrent facilement dans la RAM de nos jours), mais avez-vous un intérêt pour les alternatives commerciales à SAS ou cherchez-vous uniquement à FOSS?
whuber
1
Oui, les solutions FOSS sont ce que je recherche. Je suis d'accord qu'un ensemble de données pourrait tenir dans 5 Go de RAM, mais il doit également gérer les opérations et les structures de données supplémentaires qui sont créées lors de l'analyse exploratoire des données. Ajoutez à cela des ordinateurs portables commerciaux équipés d'un maigre 4 Go de RAM et les frais généraux consommés par le système d'exploitation et les erreurs de mémoire apparaissent assez rapidement.
Zelazny7
2
@ Zelazny7: Ajouter un autre 4Gigs à un ordinateur portable devrait être assez bon marché de nos jours. :)
curious_cat
3
Une autre option consiste à stocker les données dans une base de données (SQL ou autre). Souvent, une analyse ne nécessite qu'un sous-ensemble de données (variables 1:10, mais pas 1: 1000) qui tiennent en mémoire. Si le sous-ensemble est encore plus grand que la mémoire, l'analyse peut être effectuée en morceaux (chargez les données de la base de données 1000 observations à la fois, rassemblez les résultats ensemble à la fin).
jthetzel
1
Assurez-vous de revoir les questions de Big Data sur SO, ainsi que la vue des tâches de calcul haute performance sur CRAN pour d'autres discussions connexes, si vous ne l'avez pas déjà fait.
jthetzel

Réponses:

3

si vous atteignez 500 000 enregistrements x 2 000 variables, je dépenserais un peu plus d'argent en RAM pour votre ordinateur portable et j'en finirais avec. si vous avez 16 Go, vous pouvez probablement lire directement l'ensemble de données que vous décrivez dans R. et à ce stade, vous pourrez faire beaucoup plus - et très rapidement .. mais vous dites que ce n'est pas une option, donc:

regardez les packages basés sur SQL pour R. ceux-ci vous permettent de vous connecter à des bases de données externes et d'accéder à ces tables via SQL. puisque SQL est assez universel (et puisque R est open-source), votre code ne sera pas perdu si vous changez de travail ou perdez l'accès à SAS. la base de données externe la plus facile à configurer est, RSQLitemais de loin la plus rapide MonetDB.R( tests de vitesse )

il y a probablement quelques bonnes solutions à votre problème déclaré, je suppose que presque toutes impliquent R;)

Anthony Damico
la source
2

Peut-être ne s'agit-il pas tant des applications / problèmes que vous visez et de ses caractéristiques, mais plutôt des algorithmes et des variantes que vous utilisez. Plus concrètement, afin de gérer les mégadonnées, de nombreuses variantes basées sur la descente de gradient stochastique d'algorithmes populaires, comme SVM, sont apparues qui sont capables de gérer cela.

Scikit prend en charge certains de ces algorithmes (SVM, kNN, kmeans, ...). Je suppose que ce joli graphique peut vous aider à comprendre rapidement, si scikit a du sens pour vous.

J'espère que cela pourra aider

NOTE: ce qui suit est une réponse au commentaire de zelazny7

Maintenant je vous ai compris. Ce que vous cherchez, ce sont des pandas . Jetez un œil à la section des discussions. Il y a une présentation comparant brièvement le flux de travail de Panda et celui de Panda. Panda vous permet d'importer des données dans différents formats et de gérer les fichiers bgu grâce à l' intégration des tables HDF5 . De plus, vous pouvez interfacer Scikit.

jpmuc
la source
Merci! Les algorithmes devraient certainement fonctionner on-lineou sur des morceaux de données lues en mémoire et réécrites sur le disque. Scikit est génial et c'est ce que j'aimerais vraiment utiliser, mais quels outils / flux de travail / approches existent pour les étapes très nécessaires d'exploration, de munging et de préparation des données avant d'appliquer ces algos? Ces langages peuvent gérer ces étapes, mais je suis vraiment à la recherche d'un exemple réel de quelqu'un qui doit faire face à ces problèmes de mémoire.
Zelazny7
J'ai édité ma réponse avec ce que vous cherchez (ou du moins je le crois!)
jpmuc
2

Vous semblez déjà à l'aise avec SAS, et vos jeux de données sont suffisamment petits pour tenir dans la RAM, mais vous ne pouvez peut-être pas insérer suffisamment de RAM dans votre ordinateur portable. Si cela ne vous dérange pas de rester avec SAS, pourquoi ne pas vous connecter à SAS fonctionnant à distance sur un ordinateur avec beaucoup de RAM? Je ne sais pas comment cela fonctionne, mais ces liens pourraient vous aider à démarrer.

Il existe d'autres bonnes raisons d'utiliser Pandas ou R, mais je ne pense pas que vous ayez à vous soucier des limites de mémoire. Si vous ne pouvez pas installer suffisamment de mémoire sur votre ordinateur portable, exécutez l'instance Python ou R ailleurs et connectez-vous avec SSH, iPython Notebook ou RStudio.

Thomas Levine
la source
1

Graphchi est excellent et peut gérer d'énormes ensembles de données. C'est un peu pénible de travailler avec, mais il peut gérer des données graphiques et non graphiques.

Zach
la source
1

Je suis récemment tombé sur SFrames et GraphLab Create. Ce sont des bibliothèques pour Python qui offrent le type de fonctionnalités que vous semblez rechercher sur le site Pypi: "SFrame est une trame de données évolutive hors du cœur, qui vous permet de travailler avec des ensembles de données qui sont plus grands que la quantité de RAM sur votre système. " Considérez-le donc comme la fonctionnalité de manipulation de données et l'API dans Pandas, mais sans mettre d'abord toutes les données en mémoire. SFrame est gratuit et open source pour autant que je sache. D'autre part, GraphLab s'appuie sur la fonctionnalité SFrame pour fournir des algorithmes pour effectuer des analyses descriptives et prédictives (apprentissage automatique) sur des données stockées dans SFrames. GraphLab Create create n'est pas gratuit / open source, mais dispose d'une licence de démonstration gratuite. Dans tous les cas, selon la sophistication de vos algorithmes, SFrame peut vous suffire.

Mateo
la source
-1

Avez-vous envisagé un "vrai" langage non interprété comme le Fortran?

Il semble que les suggestions à ce jour soient très dépendantes du fournisseur ou interprétées. Les méthodes interprétées sont notoirement mauvaises pour les applications à mémoire intense. MatLab peut être un niveau de langage beaucoup plus élevé que «C», mais les optimisations de gestion de la mémoire en C peuvent lui permettre de gérer des ensembles de données 100 fois plus rapides qui sont des millions de fois plus grands.

"R" et "Python" sont des langages merveilleux, de haut niveau, techniquement riches et très utilisés. Ils sont également interprétés.

Vous pouvez envisager l'une des instances de R-on-Hadoop. (Rhipe, autres) Cela a l'avantage de pouvoir traduire R (haut niveau, facile à programmer) en instructions MapReduce / Hadoop. Hadoop peut créer un cluster de multitraitement intéressant pour les pauvres.

http://www.datadr.org/ <- (lien Rhipe)

Fortran est développé depuis des décennies. Il a une gestion et une compilation de la mémoire très efficaces. Il possède également des bibliothèques de niveau supérieur, ce qui lui permet d'effectuer des opérations très sophistiquées très simplement. Je pourrais faire un CFD jouet dans MatLab, mais pour quelque chose de réaliste et d'auto-codé, j'utiliserais Fortran pour le traitement "big-iron" et quelque chose comme MatLab ou R pour présenter / résumer les données. Personne ne fait de logiciel CFD commercial dont le "moteur" est interprété au lieu d'être compilé. Plusieurs fournisseurs ont leur CFD moneymaker codé en C ou Fortran. SAS a été initialement écrit en C ( lien ).

Fortran et Rhipe sont accessibles. MatLab coûte de l'argent et si mon travail ne le payait pas, j'utiliserais R ou Python en ce moment.

MISE À JOUR:
Mon point a été "compilé". Python a un cython qui peut littéralement exécuter le même code (fondamental) ~ 1000 fois plus rapidement. Cela signifie que vous pouvez avoir des données ~ 1000x plus grandes et les traiter presque en même temps. Faire en sorte que Cython fonctionne correctement peut être un défi, mais des outils tels que " Sage " le complètent bien. Rcpp aurait prétendument similaire, mais je ne sais pas personnellement qu'il est aussi bien développé.

Si vous y réfléchissez, les principes fondamentaux de presque tout ce que vous exécutez dans le calcul scientifique, même dans les langages interprétés, sont compilés Fortran ou compilés C. BLAS est BLAS; vous ne réinventez pas le code à chaque fois que vous faites de l' EDA . Votre langage interprété appelle ces bibliothèques, bien que de manière très inefficace, lors de son exécution.

En passant, vous pourriez regarder JMP . Il a une interface très facile à utiliser et est excellent pour l'analyse de données exploratoires très visuelles ( EDA ).

EngrStudent
la source
2
Comment explorez-vous les données avec un langage compilé comme fortran? L'attrait des langages interprétés, pour moi, est le REPL qui fournit une introspection riche et me permet d'apprendre rapidement ce que je traite ainsi que de jouer avec de nouvelles fonctions de bibliothèque que je ne connais peut-être pas.
Zelazny7
1
Rcpp est très bien développé (il suffit de vérifier l'utilisation inverse sur CRAN), mais pas vraiment comparable à cython. Si vous avez une fonction définie, oui, vous pouvez prendre l'entrée R, la traiter dans Cpp et renvoyer les données à R. Mais vous ne compilerez pas un script R entier dans Cpp de sitôt.
russellpierce