2011-06-22 14 views
5

Jakob Østergaard presented to wyzwanie:Parallel odrębny licznik słowo Przejdź

Napisz program, który czyta tekst ze standardowego wejścia-i Returns (wydruki) ogólnej liczby występujących w tekście odrębnych słów.

Jak możemy sprostać temu wyzwaniu przy programowaniu równoległym (najlepiej w Go, ale wystarczający będzie opis w języku angielskim)?

+1

Dlaczego uważasz, że ten problem jest podatny na efektywną równoległość? – peterSO

+2

Wydaje się mało prawdopodobne, że zrównoleglenie tego będzie przydatne. Potrzebujesz jednego procesu, aby podzielić tekst na tokeny, co jest sporym kawałkiem pracy, a pozostałym zadaniem jest zwiększenie liczby w słowniku, który albo wymaga zablokowania, albo zachowania oddzielnego słownika na pracownika i scalenia ich, prawdopodobnie eliminując wszelkie korzyści z liczenia osobno. –

+1

Tim Bray opracował równoległy test porównawczy do przetwarzania plików dziennika w wielu językach, zwany ["Wide Finder"] (http://www.tbray.org/ongoing/When/200x/2008/05/01/Wide -Finder-2). Możesz uznać to za istotne. Przetwarzanie plików to coś, co można zrobić równolegle, ale być może nie jest to standardowe wejście. – kristianp

Odpowiedz

3

Istnieje kilka możliwości, ale myślę, że masz na myśli "sprawnie"?

Ogólna koncepcja polegałaby na podzieleniu tekstu na porcje, wrzucenie tych porcji do kolejki i umożliwienie wielu konsumentom poradzenia sobie z porcjami.

To wygląda jak typowa mapa/Reduce aplikację do mnie:

  _ Worker_ 
     /  \ 
     /   \ 
Splitter--- Worker ---Aggregator 
     \   /
     \_ Worker _/ 

Idealnie „kilka” kolejki byłoby ani jednego z wielu konsumentów, tak, że jeśli jeden pracownik spowalnia cały proces nie spowalnia tak bardzo.

Chciałbym również użyć sygnału od Splittera do pracowników, aby dać im znać, że dane wejściowe zostały w pełni zużyte i mogą rozpocząć wysyłanie swoich wyników do agregatora.

1

Oto rozwiązanie, w Go, do Jakob Østergaard's problem.

/* 
    The problem: Write a program that reads text from 
    standard-input, and returns (prints) the total 
    number of distinct words found in the text. 

    C versus C++, Jakob Østergaard, February 24th, 2004 
    http://unthought.net/c++/c_vs_c++.html 
*/ 

package main 

import (
    "bufio" 
    "fmt" 
    "os" 
    "unicode" 
) 

func main() { 
    rdr := bufio.NewReader(os.Stdin) 
    words := make(map[string]bool, 1024*1024) 
    word := make([]int, 0, 256) 
    for { 
     r, n, _ := rdr.ReadRune() 
     if unicode.IsSpace(r) || n == 0 { 
      if len(word) > 0 { 
       words[string(word)] = true 
       word = word[:0] 
      } 
      if n == 0 { 
       break 
      } 
     } else { 
      word = append(word, r) 
     } 
    } 
    fmt.Println(len(words)) 
} 

To naiwne dodawanie wyrażenia "programowanie równoległe" do tego i większości innych problemów i spodziewać się magicznej poprawy. Odczytywanie danych wejściowych sekwencyjnie ze strumienia i wykonywanie prostych obliczeń nie daje znaczących możliwości dla parallel computing.

+0

(-1) Odczyt ze standardowego wejścia jest tylko uproszczeniem, prawdziwe pytanie dotyczy algorytmowej pracy polegającej na równoległym pomijaniu, która ma rzeczywiste zastosowania i rzeczywiste efekty w obliczeniach równoległych. – Soren