Les meilleures pratiques pour la tenue des listes énormes de données en Java
Je suis en train d'écrire un petit système en Java dans laquelle j'ai extrait n-gramme fonction à partir de fichiers texte et, plus tard, le besoin d'effectuer Fonctionnalité processus de Sélection afin de sélectionner les plus discriminants fonctionnalités.
La Fonctionnalité de processus d'Extraction d'un fichier unique de retour d'une Carte qui contient pour chaque fonctionnalité unique, de ses occurrences dans le fichier. J'ai fusionner tous les fichiers de Cartes (Map) dans une Carte qui contient le Document de Fréquence (DF) de toutes les caractéristiques uniques extraits à partir de tous les fichiers. Le unifiée Carte peut contenir au-dessus de 10 000 000 d'entrées.
Actuellement la Fonctionnalité de processus d'Extraction fonctionne très bien et je veux effectuer la Sélection des fonctionnalités dont j'ai besoin pour mettre en œuvre le Gain d'Informations ou de Gain Ratio. Je vais avoir à trier les Carte tout d'abord, effectuer des calculs et enregistrer les résultats afin d'obtenir enfin une liste d' (pour chaque fonction, sa Fonction de Sélection de la partition)
Ma question est:
Quelle est la meilleure pratique et la meilleure structure de données pour tenir cette grande quantité de données (~10M) et effectuer des calculs?
OriginalL'auteur Aviadjo | 2015-01-14
Vous devez vous connecter pour publier un commentaire.
C'est une très vaste question, la réponse est donc d'aller trop large. La solution dépend de (au moins) ces trois choses:
Stockage de 10 000 000 d'entiers aura besoin d'environ 40MiB de mémoire, alors que le stockage de 10 000 000 x 1KiB dossiers, il faudra plus qu'9GiB. Ce sont deux problèmes différents. Dix millions d'entiers sont triviales à stocker dans la mémoire de tout le stock de Java collection, tout en gardant 9GiB dans la mémoire va vous forcer à modifier et optimiser le Tas Java et le garbage collector. Si les inscriptions sont encore plus grands, dire 1MiB, alors vous pouvez oublier le stockage en mémoire entièrement. Au lieu de cela, vous aurez besoin de se concentrer sur la recherche d'un bon disque soutenu la structure de données, peut-être une base de données.
Stockage de dix millions de 1KiB enregistrements sur une machine avec 8 Go de ram n'est pas la même chose que de les stocker sur un serveur avec 128GiB. Les choses qui sont à peu près impossible avec l'ancienne machine sont triviales avec ce dernier.
Vous avez mentionné le tri, donc les choses comme TreeMap ou peut-être PriorityQueue viennent à l'esprit. Mais est-ce la plus intense de calcul? Et qu'est-ce que la clé que vous utilisez pour les trier? Comptez-vous sur la localisation (se) des entités basées sur d'autres propriétés qui ne sont pas la clé? Si oui, qui nécessite de planification distinct. Sinon, vous auriez besoin pour effectuer une itération sur l'ensemble des dix millions d'entrées.
Faites vos calculs exécuter dans un thread unique ou plusieurs threads? Si vous avez les modifications concurrentes de vos données, qui nécessite une solution distincte. Structures de données telles que TreeMap et PriorityQueue devrait être verrouillé ou remplacé avec des structures telles que ConcurrentLinkedHashMap ou ConcurrentSkipListMap.
OriginalL'auteur Malt
Mon intuition est que vous pourriez prendre de l'inspiration à partir de la première MapReduce de paradigme et de la partition de votre problème en plusieurs plus petits, mais semblables et ensuite regrouper ces résultats partiels afin de parvenir à la solution complète.
Si vous parvenez à résoudre un petit problème instance à la fois (c'est à dire le fichier de morceau) cela vous garantira un espace de consommation de pénalité délimitée par l'espace requis pour cette seule instance.
Cette approche pour traiter le fichier paresseusement travaillera invariant de la structure de données que vous choisissez.
OriginalL'auteur Radu Stoenescu
Vous pouvez utiliser un système de cache, vérifiez MapDB elle est très efficace et a un arbre de la carte de mise en œuvre (de sorte que vous pouvez avoir vos données commandés sans aucun effort). En outre, il fournit des magasins de données pour enregistrer vos données sur le disque lorsqu'il ne peut être tenue sur la mémoire.
OriginalL'auteur bachr