Więc arraylista "grzebień" zawiera ciągi o równej długości i odmian niektórych znaków. W najgorszym przypadku scenariusza ta lista może zawierać około 100 000 słów. Sprawdzanie funkcji (STR STR) zajmuje jedno słowo jako parametr i sprawdza, czy to słowo jest obecne w słowniku Hashtable (który zawiera kolejne 90 000 słów, plik tekstowy został przeczytany do tego hashtable). Zasadniczo kod musi sprawdzić, który ze słów z listy "Grzebień" jest obecny w "Słownik" Hashtable ". W najgorszym przypadku, scenariusz wyszukiwania zajmuje 5 minut. Chcę go wdrożyć i równoległe, ale niepewne, jak o to pójść.

Na przykład: Grzebień LIST zawiera różne błędnie napisy Curmudgeon i właściwe słowo. Ta lista zawiera 98415 z nich. Curmuegeon Curmuluegeeoh CurmüeaJ Curmuegekn itp. Więc sprawdzenie, czy każdy z tych słów jest obecnych w tabeli Hash trwa 200 sekund. Tym razem chcę sprowadzić

class key implements Runnable{
    public static ArrayList<String> comb;
    public static Hashtable<String,String> dictionary; 
    public static void main(String[] args) throws IOException{
        key obj = new key();
        Thread thread1 = new Thread(obj);
        thread1.start();
    }
    public static Boolean checkWord(String str){
                String toCheck = str.toLowerCase();
                if(dictionary.contains(toCheck)){
                    return true;
                }
                else
                 return false;
      }
        public void run(){
            for(String x:comb)
                if ( checkWord(x) )
                    filtered.add(x);

        }
1
daipayan 16 luty 2017, 19:29

2 odpowiedzi

Najlepsza odpowiedź

HashTable jest dziedzicą klasą API JDK1.0 z bardzo silnymi gwarancjami współbieżnymi. W Poszczególne,

W przeciwieństwie do nowych implementacji kolekcji, zsynchronizowano Hashtable.

Oznacza to, że każda operacja na Hashtable musi uzyskać blokadę monitora, która jest zabójcą wydajności dla powtarzających się wyszukiwania. Najlepiej jest przestrzegać zaleceń podanych w JDK Javadocs:

Jeśli implementacja bezpieczna wątków nie jest potrzebna, zaleca się stosowanie hashmapu w miejscu hashtable. Jeśli pożądany jest wysoce współbieżne wdrożenie, zaleca się stosowanie koncentrospecterenshmap zamiast hashtable.

1
dhke 16 luty 2017, 18:51

Aby wykonać to wydajne, potrzebujesz wielu sprężystości, które testują różne zakresy listy grzebieniowej niezależnie, jak

public class MySearcher implements Runnable {
  ArrayList list;
  int startIdx, endIdx;
  public MySearcher(list, startIdx, endIdx) {
    // copy into object fields
  }
  public void run () {
    // test all values in the list between startIdx and endIdx
    // put results into a data structure. Create a method to get/return that data structure
  }
}

Następnie możesz użyć executorservice dla wszystkich swoich runnych (do użycia, zobacz Javadoc: http://docs.oural.com/javase/7/docs/api/java/util/concurrent/executorservice.html)

0
ControlAltDel 16 luty 2017, 16:50