2016-07-23 1 views
0

Dans Scala comment efficacement (mémoire consommation + performance) lire très grand fichier csv? est-il assez rapide pour le diffuser ligne par ligne et traiter chaque ligne à chaque itération?Quel est le moyen efficace de lire et de traiter de très gros fichiers CSV dans Scala (> 1 Go)?

Ce que je dois faire avec des données CSV: -> Dans mon application Une seule ligne dans le fichier CSV est traité comme un seul enregistrement et tous les enregistrements du fichier CSV doivent être convertis en éléments XML et JSON formater et l'enregistrer dans un autre fichier aux formats xml et json. Donc ici la question est lors de la lecture du fichier de CSV est une bonne idée de lire le fichier en morceaux et de fournir ce morceau à un autre thread qui va convertir ces enregistrements CSV en xml/json et écrire xml/json à fichier? Si oui comment?

Les données du CSV peuvent être n'importe quoi, il n'y a aucune restriction sur le type de données qu'il peut être numérique, grand décimal, chaîne ou date. Un moyen facile de gérer ces différents types de données avant de l'enregistrer en XML? ou nous n'avons pas besoin de prendre soin des types?

Merci beaucoup

+1

Le titre de votre question n'a rien à voir avec la question elle-même, alors quel est votre problème? –

+0

ok laissez-moi le rendre plus clair dans les modifications – user840502

+0

En supposant que les transformations ne prennent pas beaucoup de temps (et de votre description, ils ne le font pas). l'heure sera entièrement dominée par le fichier I/O. Cela dépendra donc de la façon dont vous le ferez. En supposant que vous utilisiez une lecture et une écriture en mémoire tampon, cela ne changera en rien la façon dont vous structurez le reste (vous pouvez utiliser l'écriture asynchrone pour traiter un tampon en attendant que l'écriture soit terminée, mais cela vous évite un seul –

Répondre

0

Si ce n'est pas une tâche une fois, créer un programme qui va briser ce fichier de 1 Go de fichiers de petite taille. Ensuite, fournissez ces nouveaux fichiers comme une entrée pour séparer les contrats à terme. Chaque futur lit un fichier et le résout dans l'ordre du contenu du fichier. Fichier4 résout après File3, qui résout après File2, qui se résout après File1. Comme le fichier n'a pas de paire clé-valeur ou structure de données hiérarchique, je vais donc suggérer, il suffit de lire comme une chaîne. J'espère que cela aide.

+0

Si vous utilisez Futures pour le traitement de plus petits morceaux, comment auriez-vous le contrôle sur la commande? – user840502

+0

vous pouvez avoir le futur oncomplete {appelez l'autre avenir ici pour lire le fichier suivant, dans le côté que vous pouvez encore faire OnComplete. Ou vous ajoutez tous les contrats à terme à une liste [Future], puis appelez future.sequence. – user2056463