Question

J'ai donc un "gros" " nombre de " très grand " Fichiers ASCII contenant des données numériques (gigaoctets au total), et mon programme devra en traiter l’ensemble de manière séquentielle au moins une fois.

Un conseil sur le stockage / chargement des données? J'ai pensé convertir les fichiers au format binaire pour les réduire et accélérer le chargement.

Dois-je tout charger en mémoire en même temps?
Sinon, est-ce que l'ouverture est un bon moyen de charger partiellement les données?
Quels sont les conseils d’efficacité pertinents pour Java?

Était-ce utile?

La solution

  

Alors, que se passe-t-il si le traitement nécessite de parcourir les données pour plusieurs fichiers et plusieurs mémoires tampons? L’ouverture et la fermeture constantes de fichiers binaires vont-elles coûter cher?

Je suis un grand fan de "entrées / sorties mappées en mémoire", également appelées "tampons d'octets directs" . En Java, ils s'appellent Tampons d’octets mappés font partie de java.nio. (Fondamentalement, ce mécanisme utilise le système de pagination de mémoire virtuelle du système d'exploitation pour "mapper" vos fichiers et les présenter par programme sous forme de tampons d'octets. Le système d'exploitation gérera le déplacement des octets vers / depuis le disque et la mémoire automatiquement et très rapidement.

Je suggère cette approche car a) cela fonctionne pour moi et b) cela vous permettra de vous concentrer sur votre algorithme et de laisser la JVM, le système d'exploitation et le matériel gérer l'optimisation des performances. Tous trop souvent, ils savent mieux que quiconque ce qu'il y a de mieux. ;)

Comment utiliseriez-vous les MBB dans votre contexte? Créez simplement un MBB pour chacun de vos fichiers et lisez-les comme bon vous semble. Vous aurez seulement besoin de stocker vos résultats. .

BTW: Combien de données traitez-vous en Go? Si la capacité est supérieure à 3 ou 4 Go, cela ne fonctionnera pas pour vous sur un ordinateur 32 bits, car l'implémentation de MBB est défenderesse sur l'espace mémoire adressable par l'architecture de la plate-forme. Une machine 64 bits & amp; Le système d'exploitation vous amène à 1 To ou 128 To de données mappables.

Si vous songez à la performance, sachez alors que Kirk Pepperdine (un gourou de la performance Java assez connu) est impliqué dans un site Web, www.JavaPerformanceTuning.com, qui contient quelques détails supplémentaires sur MBB: Conseils de performances NIO et autres éléments relatifs aux performances Java.

Autres conseils

Vous pouvez consulter les entrées de Projet de recherche étendu (effectuez une recherche google pour " recherche large "& java ).

Le détecteur Wide implique la lecture d’un grand nombre de lignes dans les fichiers journaux. Consultez donc les implémentations Java et voyez ce qui a fonctionné et ce qui n’y a pas fonctionné.

Vous pouvez convertir en binaire, mais vous disposez alors d'une ou plusieurs copies des données si vous devez conserver l'original.

Il peut être pratique de créer un index quelconque par-dessus vos données ascii d'origine afin que, si vous avez besoin de consulter à nouveau les données, vous puissiez le faire plus rapidement par la suite.

Pour répondre à vos questions dans l'ordre:

  

Dois-je tout charger en mémoire en même temps?

Pas si ce n’est pas nécessaire. Pour certains fichiers, vous pourrez peut-être le faire, mais si vous ne faites que traiter séquentiellement, il vous suffit de faire une sorte de lecture tampon des choses, une par une, en enregistrant tout ce dont vous avez besoin en cours de route.

  

Si non, est-ce que l'ouverture est un bon moyen de charger partiellement les données?

BufferedReaders / etc est la solution la plus simple, mais vous pouvez vous pencher davantage sur FileChannel / etc pour utiliser les E / S mappées en mémoire afin de parcourir les fenêtres des données à la fois.

  

Quels sont certains conseils d'efficacité pertinents pour Java?

Cela dépend vraiment de ce que vous faites avec les données elles-mêmes!

Sans plus d'informations sur le type de traitement en cours, voici quelques réflexions d'ordre général à propos de mon travail similaire.

  1. Ecrivez un prototype de votre application (peut-être même un "à jeter") qui effectue une opération arbitraire sur votre ensemble de données. Voyez à quelle vitesse ça va. Si la chose la plus simple et la plus naïve à laquelle vous pouvez penser est rapide, ne vous inquiétez pas!

  2. Si l'approche naïve ne fonctionne pas, envisagez de pré-traiter les données afin que les exécutions suivantes s'exécutent dans un délai acceptable. Vous avez mentionné devoir "sauter". dans l'ensemble des données un peu. Y a-t-il un moyen de pré-traiter cela? Une étape de prétraitement peut également consister à générer encore plus de données - des données d’index - fournissant des informations de localisation précises sur les octets des sections critiques et nécessaires de votre jeu de données. Ensuite, votre processus de traitement principal peut utiliser ces informations pour accéder directement aux données nécessaires.

Donc, pour résumer, mon approche serait d’essayer quelque chose de simple maintenant et de voir à quoi ressemble la performance. Peut-être que ça ira. Sinon, examinez le traitement des données en plusieurs étapes, en économisant les opérations les plus coûteuses pour un prétraitement peu fréquent.

Ne "chargez pas tout dans la mémoire". Il vous suffit d’accéder aux fichiers et de laisser le cache de pages de disque du système d’exploitation décider quand extraire directement des éléments de la mémoire.

Cela dépend beaucoup des données du fichier. Les gros ordinateurs centraux effectuent un traitement de données séquentiel depuis longtemps, mais ils n'utilisent généralement pas d'accès aléatoire pour les données. Ils se contentent de tirer les lignes à la fois et de procéder comme avant de continuer.

Pour un accès aléatoire, il est souvent préférable de créer des objets avec des wrappers de mise en cache qui savent où se trouvent les données dans le fichier. Au besoin, ils lisent ces données et se construisent eux-mêmes. Ainsi, lorsque la mémoire est saturée, vous pouvez commencer à supprimer des éléments sans trop vous inquiéter de ne pas pouvoir les récupérer plus tard.

Vous ne nous avez pas vraiment donné assez d’informations pour vous aider. Avez-vous besoin de charger chaque fichier dans son intégralité pour pouvoir le traiter? Ou pouvez-vous le traiter ligne par ligne?

Le chargement d'un fichier entier à la fois risque de nuire aux performances, même pour des fichiers de taille réduite. Votre meilleur choix est de définir une taille de tampon qui vous convient et de lire / traiter les données tampon par tampon.

J'ai constaté qu'Informatica était un outil de traitement de données exceptionnellement utile. La bonne nouvelle est que les versions les plus récentes permettent même des transformations Java. Si vous avez affaire à des téraoctets de données, le moment est peut-être venu de vous procurer les meilleurs outils ETL.

Je suppose que vous voulez faire quelque chose avec les résultats du traitement ici, comme le stocker quelque part.

Si vos données numériques sont régulièrement échantillonnées et que vous devez effectuer un accès aléatoire, envisagez de les stocker dans un quadtree .

Je vous recommande de miser fortement sur les expressions régulières et d'examiner le "nouveau". Paquet IO nio pour une saisie plus rapide. Ensuite, vous devriez vous attendre aussi rapidement que vous pouvez vous attendre à des gigaoctets de données.

Si possible, récupérez les données dans une base de données. Vous pouvez ensuite exploiter toutes les fonctionnalités d’indexation, de mise en cache, de mémorisation de la mémoire et d’autres fonctionnalités à votre disposition.

Si vous devez accéder aux données plusieurs fois, chargez-les dans une base de données. La plupart des bases de données ont une sorte d'utilitaire de chargement en masse. Si les données peuvent toutes tenir dans la mémoire et que vous n’avez pas besoin de les conserver ou d’y accéder aussi souvent, vous pouvez probablement écrire quelque chose de simple en Perl ou dans votre langage de script favori.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top