2009-12-03 2 views
2

d'abord désolé pour ma mauvaise grammaire. Je veux construire un algorithme de clustering hiérarchique simple en Java, donc j'ai besoin de construire une matrice de similarité, dont l'entrée ij donne la similarité entre les clusters i et j.Java a besoin de stocker des valeurs dans un tableau multidimensionnel. Quelle est la meilleure méthode pour réserver de l'espace mémoire?

La première pensée utilise int [] [] pour stocker cette matrice (chaque cluster a un ID de type entier).

Je pense qu'avoir par exemple initialement 5000 clusters conduira au crash de la mémoire du programme, donc des idées pour stocker d'une autre manière cette matrice? Peut-être dans une autre structure de données?

Merci

Répondre

1

2000 x 2000 n'est pas beaucoup de mémoire ces jours-ci pour que vous puissiez faire juste

int[][] = new int[2000][2000]; 

Si certaines entrées ne sont pas une entrée de similarité, alors vous pourriez peut-être Exploitez la parcimonie et sauvez de la mémoire, mais à moins d'avoir des contraintes d'espace, je ne pense pas que cela en vaille la peine.

0

Va-t-il vraiment planter? La matrice tiendra 5000x5000 = 25 millions de valeurs int. I encore pense, la JVM peut gérer cela. Il se peut que vous ayez besoin d'une autre table de hachage pour mapper de la valeur d'index cluster à array, mais ce n'est pas trop important. Il suffit d'augmenter la mémoire, une JVM 32 bits peut utiliser 2 Go de RAM, c'est assez.

Si vous avez vraiment besoin de calculer la similarité pour tous les clusters, alors chaque cellule de la matrice aura une valeur et je pense qu'il n'y a pas de meilleure structure de données pour le résultat.

1

25 millions d'ints prennent environ 100Mb de mémoire.

L'ajout d'un commutateur -Xmx256m lors de l'exécution de java devrait suffire si vous utilisez la route int [] [].

Si vous n'avez pas besoin de la préréglage de int, allez à court pour couper la mémoire à 50M.

Si la plupart des valeurs sont 0, vous devriez certainement google pour une implémentation matricielle clairsemée. Si la similarité (i, j) est toujours égale à la similarité (j, i), vous pouvez l'utiliser pour raser la moitié aussi bien.

+0

.. parce qu'un tableau à deux dimensions ne doit pas être rectangulaire, chaque ligne peut avoir sa propre longueur, de sorte que vous pouvez facilement créer un structure de données triangulaire avec longueur (ligne) = longueur (r-1) -1 (+1 pour cette indication!) –