2017-04-20 2 views
-1

J'ai un code comme ceci:réduire le temps d'exécution en boucle

RandomAccessFile raf = new RandomAccessFile(new File("C:\\Users\\AhmadMaleki\\IdeaProjects\\Hello world\\src\\kish\\file1"), "r"); 

for (int i = 1 ; i < 1025 ; i++) 
     { 
      for (int j = 0; j < raf.length() - 4 ; j++) 
      { 
       raf.seek(j); 
       byte[] b = new byte[5]; 
       raf.read(b); 

       if (new String (b).equals(wordcount[i])) 
       { 
        z[i]++; 
       } 
      } 
     } 

Dans le présent code raf.length() = 26841039 et le temps d'exécution est 4100 minutes. Y a-t-il des solutions pour réduire le temps d'exécution? (Par exemple multi-thread, parallèle, ....)

+2

Bienvenue dans Stack Overflow. Ce site est en fait censé être pour du code qui ne fonctionne pas. Vous voulez [Code Review] (https://codereview.stackexchange.com/). – Michael

+0

Il est très probable que cela peut être optimisé. A titre d'exemple, je doute vraiment que vous ayez besoin de lire le fichier 1024 fois. Au lieu de cela, vous pourriez vouloir le lire d'un seul coup, construire une structure pour contenir les données et agir sur cela. – Thomas

+0

Continuant je doute que vous ayez besoin de RandomAccessFile pour ceci. Lire continuellement comme un flux est plus rapide. –

Répondre

1

Pour un démarrage, changez vos boucles pour ne pas lire le même fichier 1024 fois.

for (int j = 0; j < raf.length() - 4 ; j++){ 
    for (int i = 1 ; i < 1025 ; i++){ 
     // Do your things here ... 
    } 
} 

Puis choisissez judicieusement votre flux d'entrée.

+0

Pas besoin de cette boucle du tout ... juste besoin de faire ce que j'ai écrit dans le commentaire: mettre les mots dans un ensemble et le vérifier comme ceci:' if (words.contains (new String (b)) z [i] ++ ' – paranoidAndroid

+0

Il n'y a pas de 'i' si vous supprimez la boucle interne En utilisant' Map '(au lieu d'un ensemble), vous pouvez en fait:' map.set (mot, map.get (mot) + 1) '. Ce serait vraiment une amélioration, mais peut-être pas aussi perceptible – minus

+0

Pourquoi avez-vous besoin de' i'? Il veut juste vérifier si le mot est contenu dans le dictionnaire, donc je pense que le 'HashSet' devrait être suffisant, non? le point entier de la boucle comme je l'obtiens c'est juste pour vérifier tous les mots dans le dictionnaire – paranoidAndroid