2010-05-16 2 views
2

J'écris une application Java qui, entre autres choses, doit lire un fichier texte dictionnaire (chaque ligne est un mot) et le stocker dans un HashSet. Chaque fois que je lance l'application, ce même fichier est en cours de lecture (fichier Unicode de 6 mégaoctets). Cela a semblé cher, donc j'ai décidé de sérialiser HashSet résultant et de le stocker dans un fichier binaire. Je m'attendais à ce que mon application s'exécute plus rapidement après cela. Au lieu de cela, il est devenu plus lent: de ~ 2,5 secondes avant ~ 5 secondes après la sérialisation.Vitesse de désérialisation de Java

Ce résultat est-il attendu? Je pensais que dans des cas similaires, la sérialisation devrait augmenter la vitesse.

+0

Quelle est la taille du fichier résultant après la sérialisation? Cela peut également donner un indice sur la vitesse. – BalusC

+0

A peu près la même chose. le fichier texte est 6.536.068 et le binaire sérialisé est 6.879.332 – celicni

+0

2 1/2 secondes ne sont pas tout un tas de temps, vous pourriez vouloir pré-traiter votre fichier pour éliminer les espaces, vous pouvez également essayer de le zipper et de benchmarking pour voir si cela augmente la vitesse. –

Répondre

5

Il ne s'agit pas d'un mécanisme de sérialisation ou d'un autre, il s'agit de la structure de données que vous numérotez.

Vous avez une représentation très efficace et naturelle de ces mots: une liste simple, dans le fichier texte. C'est rapide à lire.

Vous avez créé une structure de données pour les stocker qui est différente: une table de hachage. Il faut plus de mémoire pour représenter une table de hachage. Cependant, l'avantage est qu'il est très rapide de chercher un mot, par rapport à une simple liste. Mais ce compromis signifie que la sérialisation devient plus lente, car la sérialisation naïve d'une table de hachage sérialisera plus de données et sera plus grande, et donc plus lente.

Je pense que vous devriez vous en tenir à la simple lecture du fichier texte.

+0

Cela semble logique. Excepté le fichier binaire sérialisé n'a pas obtenu beaucoup plus grand que le fichier texte d'origine 6.536.068 à 6.879.332. – celicni

+0

Alors que ce n'était pas * plus long *, c'était * plus complexe *. C'est ce qui ralentit. –

+0

OK, merci. Je vais suivre le conseil et m'en tenir à une lecture simple. – celicni

2

@ La réponse de Sean est correcte. La sérialisation/désérialisation Java a des frais généraux de performance significatifs. Si vous devez effectuer le chargement plus rapide dictionnaire (ou ...), tenez compte des approches suivantes:

  • En utilisant les java.nio.* classes pour lire le fichier peut accélérer les choses.
  • Si l'application n'a pas nécessairement besoin de charger le dictionnaire instantanément au démarrage, vous pouvez utiliser un thread distinct pour charger le dictionnaire de manière asynchrone. Le chargement du dictionnaire n'est pas plus rapide, mais (par exemple) l'interface graphique de l'application démarre plus rapidement de toute façon.
+0

L'utilisation du fil séparé travaillera pour moi. Merci pour l'idée. – celicni