32 votes

grande quantité de données dans plusieurs fichiers texte - comment traiter?

J'ai de grandes quantités de données (quelques téraoctets) et accumule... Ils sont présents dans de nombreux délimité par des tabulations à plat des fichiers texte (chacune d'environ 30 MO). La plupart de la tâche consiste à lire les données et de l'agrégation (résumé/moyenne + de transformations supplémentaires) sur des observations ou des lignes en fonction d'une série de prédicat états, et enregistrer le résultat en tant que texte, HDF5, SQLite ou des fichiers, etc. J'ai l'habitude de l'utilisation de R pour de telles tâches, mais j'ai peur de ce qui peut être un peu grand. Certaines solutions sont à

  1. écrire le tout en C (ou Fortran)
  2. importer les fichiers (tables) dans un base de données relationnelle directement et retirez ensuite les morceaux dans R ou Python (certains de ces transformations ne sont pas prête pour un pur SQL solutions)
  3. écrire le tout en Python

Serait (3) être une mauvaise idée? Je sais que vous pouvez envelopper les routines C en Python, mais dans ce cas puisqu'il n'y a rien de calcul prohibitif (par exemple, l'optimisation des routines qui nécessitent de nombreux calculs itératifs), je pense que les e/S peuvent être autant d'un goulot d'étranglement que le calcul lui-même. Avez-vous des recommandations sur d'autres considérations ou des suggestions? Merci

Edit Merci pour vos réponses. Il semble y avoir des divergences d'opinion sur Hadoop, mais en tout cas je n'ai pas accès à un cluster (si je peux l'utiliser plusieurs unnetworked machines)...

14voto

Alex Martelli Points 330805

(3) n'est pas nécessairement une mauvaise idée, Python facilite le processus de fichier "CSV" (et en dépit de la C permanent pour la Virgule, tabulation comme séparateur est tout aussi facile à manipuler) et bien sûr obtient à peu près autant de bande passante I/O ops que dans toute autre langue. Comme pour d'autres recommandations, numpy, en plus d'un calcul rapide (qui peut ne pas être nécessaire selon vos instructions) fournit très pratique, flexible multi-dimensions des tableaux, ce qui peut être assez pratique pour vos tâches; et la bibliothèque standard du module multiprocessing vous permet d'exploiter plusieurs cœurs pour n'importe quelle tâche qui est facile à paralléliser (important car juste au sujet de chaque machine, ces jours-a multi-coeurs;-).

13voto

Dirk Eddelbuettel Points 134700

Ok, alors juste pour être différent, pourquoi ne pas R?

  • Vous semblez connaître R de sorte que vous pouvez obtenir pour travailler le code rapidement
  • 30 mo par fichier n'est pas grand sur la station de travail standard avec quelques go de ram
  • l' read.csv() variante de l' read.table() peut être très efficace si vous spécifiez les types de colonnes via l' colClasses argument: au lieu de guestimating types de conversion, ils seront traités de manière efficace
  • le goulot d'étranglement est ici i/o à partir du disque et qui est le même pour toutes les langues
  • R a multicœur pour configurer le traitement parallèle sur des machines avec plusieurs base (similaire à Python multitraitement, paraît-il)
  • Si vous désirez utiliser l' 'embarrassant parallèle de la structure du problème, R a plusieurs paquets qui sont bien adaptés à des données parallèles problèmes: E. g. la neige et foreach peuvent être déployées sur une seule machine, ou sur un ensemble de machines en réseau.

6voto

Marcelo Cantos Points 91211

Jetez un oeil à la Discothèque. C'est un léger distribué MapReduce moteur, écrit en 2000 lignes de Erlang, mais spécialement conçu pour Python de développement. Il prend en charge non seulement de travailler sur vos données, mais également de stocker une réplication de manière fiable. Ils ont tout juste de publier la version 0.3, qui comprend une indexation et de la couche de base de données.

4voto

SquareCog Points 12947

Avec téraoctets, vous aurez envie de paralléliser votre lit plus beaucoup de disques de toute façon; ainsi pourrait tout aussi bien aller directement dans Hadoop.

L'utilisation de Porc ou de la Ruche à la requête, les données; les deux ont une vaste définis par l'utilisateur transformations, de sorte que vous devriez être en mesure de mettre en œuvre ce que vous devez faire à l'aide d'un code personnalisé.

4voto

JD Long Points 20477

J'ai eu de la chance de l'utilisation de R avec Hadoop sur Amazon Elastic Map Reduce. Avec DME, vous ne payez que pour le temps de l'ordinateur que vous utilisez et AMZN prend soin de rotation et la rotation par les instances. Exactement comment la structure de l'emploi dans les EMR dépend vraiment de la façon dont votre workflow d'analyse est structurée. Par exemple, sont tous les enregistrements nécessaires pour un emploi contenues complètement à l'intérieur de chaque csv ou avez-vous besoin de bits de chaque csv pour effectuer une analyse?

Voici quelques ressources qui pourraient vous être utiles:

Le problème que j'ai mentionné dans mon billet de blog est plus un être liée à l'UC, pas IO lié. Les enjeux sont plus DURS, mais les conseils sur le chargement de bibliothèques et cachefiles pourrait être utile.

Alors qu'il est tentant d'essayer de pousser cette in/out d'une base de données relationnelle, je vous recommande de considérer soigneusement si vous avez vraiment besoin de tous les frais généraux d'un RDB. Si vous ne le faites pas, alors vous pouvez créer un goulot d'étranglement et défis du développement sans véritable récompense.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X