2 votes

Fichier de 5GB à lire

J'ai une question concernant la conception. J'ai un fichier de données de 3 à 4 Go, classé par horodatage. J'essaie de trouver la meilleure façon de traiter ce fichier.

Je pensais lire tout ce fichier dans la mémoire, puis transmettre ces données à différentes machines et exécuter mon analyse sur ces machines.

Serait-il judicieux de télécharger ces données dans une base de données avant d'effectuer mon analyse ?

J'ai l'intention d'effectuer mon analyse sur différentes machines. Il serait donc plus facile de le faire via la base de données, mais si j'augmente le nombre de machines sur lesquelles j'effectue mon analyse, la base de données risque de devenir trop lente.

Des idées ?

@update :

Je veux traiter les enregistrements un par un. En fait, j'essaie d'exécuter un modèle sur des données d'horodatage, mais comme j'ai plusieurs modèles, je veux les répartir de manière à ce que l'ensemble du processus s'exécute chaque jour pendant la nuit. Je veux m'assurer que je peux facilement augmenter le nombre de modèles sans diminuer les performances du système. C'est pourquoi je prévois de distribuer les données à toutes les machines qui exécutent le modèle (chaque machine exécutera un seul modèle).

2voto

lalit Points 792

Vous pouvez même accéder au fichier sur le disque dur lui-même et lire un petit morceau à la fois. Java dispose de ce que l'on appelle un fichier à accès aléatoire (Random Access file), mais le même concept est disponible dans d'autres langages.

La question de savoir si vous souhaitez charger la base de données et procéder à une analyse doit être purement régie par le besoin. Si vous pouvez lire le fichier et le traiter au fur et à mesure, il n'est pas nécessaire de le stocker dans une base de données. Mais pour l'analyse, si vous avez besoin des données de toutes les différentes zones du fichier, la base de données est une bonne idée.

1voto

Beth Points 6644

Serait-il judicieux de télécharger ces données dans une base de données avant d'effectuer mon analyse ?

oui

J'ai l'intention d'effectuer mon analyse sur différentes machines. Il serait donc plus facile de le faire via la base de données, mais si j'augmente le nombre de machines sur lesquelles j'effectue mon analyse, la base de données risque de devenir trop lente.

Ne vous inquiétez pas, tout ira bien. Il suffit d'introduire un marqueur pour que les lignes traitées par chaque ordinateur soient identifiées.

Je ne suis pas sûr de comprendre tous vos besoins, mais si vous avez besoin de conserver les données (les consulter plus d'une fois), alors une base de données est la meilleure solution. Si vous avez juste besoin de traiter des portions de ces fichiers de sortie et de faire confiance aux résultats, vous pouvez le faire à la volée sans stocker aucun contenu.

Ne stockez que les données dont vous avez besoin, et non tout ce qui se trouve dans les fichiers.

1voto

codymanix Points 12119

Il n'est pas nécessaire d'avoir tout le fichier en mémoire, mais seulement les données dont vous avez besoin pour l'analyse. Vous pouvez lire chaque ligne et ne stocker que les parties nécessaires de la ligne et, en outre, l'index où la ligne commence dans le fichier, de sorte que vous puissiez le retrouver plus tard si vous avez besoin d'autres données de cette ligne.

0voto

MikeG Points 2217

En fonction de l'analyse nécessaire, cela semble être un cas d'école pour l'utilisation de MapReduce avec Hadoop. Il vous permettra d'ajouter d'autres machines à l'avenir. Consultez le wiki Hadoop : http://wiki.apache.org/hadoop/

Commencez par la vue d'ensemble, faites fonctionner la configuration autonome sur une seule machine et essayez de faire une analyse simple de votre fichier (par exemple, commencez par un "grep" ou quelque chose comme ça). Il y a un peu d'assemblage nécessaire, mais une fois que vous avez configuré les choses, je pense que cela pourrait être la bonne voie pour vous.

0voto

Rich Points 192

J'ai eu un problème similaire récemment, et comme @lalit l'a mentionné, j'ai utilisé le lecteur de fichiers RandomAccess contre mon fichier situé sur le disque dur.

Dans mon cas, je n'avais besoin que d'un accès en lecture au fichier, j'ai donc lancé un certain nombre de threads, chaque thread démarrant à un endroit différent du fichier, ce qui m'a permis d'accomplir mon travail et d'améliorer mon débit puisque chaque thread pouvait passer une bonne partie du temps bloqué à effectuer un traitement et que, pendant ce temps, d'autres threads pouvaient être en train de lire le fichier.

Un programme comme celui que j'ai mentionné devrait être très facile à écrire, il suffit de l'essayer et de voir si les performances correspondent à ce dont vous avez besoin.

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