przetwarzanie obrazów

przetwarzanie obrazów
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:199
0

Cześć :)
Chcę napisać przetwarzanie obrazów wielowątkowo. Nie ma to być nic wygórowanego. Ot tak, żeby się czegoś nauczyć. Otóż mam listę z obiektami typu ImageBuffered. Teraz planuję, żeby obiekt wątku brał sobie referencję do obrazu ( sam wyciąga z listy i usuwa obiekt) i wykonywał na nim operacje ( metoda run() ). Załóżmy, że te pliki są gdzieś w folderze. Czy muszę jakoś synchronizować zapis do pliku? Może jest takie zagrożenie, że jeden i ten sam wątek zacznął pisać po tym samym miejscu.
Jak teraz zoorganizować żeby działało współbieżnie? Myślałem nad takim czymś:
Dopóki lista nie będzie pusta,

  1. bierz nowy wątek z CachedPool.
  2. odpal go

Tak to sobie wymyśliłem, proszę o poprawienie/wyprowadzenie z błędu. Ogólne uwagi/zagrożenia również mile widziane! :)
W szczególności, jeżeli będzie miliard obrazów to powstanie miliard wątków. Nie mam doświadczenia, więc nie wiem czy to normalna praktyka.

Czy to będzie działać współbieżnie? Czy takie współbieżne działanie będę mógł obserwować w postaci krótszego czasu pracy programu w stosunku do programu jednowątkowego.

edytowany 3x, ostatnio: mielony
datdata
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 7 lat
  • Postów:957
0

Myślę, że w takim modelu najwygodniejsze będzie użycie struktury danych, która będzie obsługiwała współbieżność np. CopyOnWriteArrayList czy coś z Guavy. Wtedy nie zdarzy się taka sytuacja, że obraz zostanie wyciągnięty dwa razy czy coś. Obsługa pliku (pobieranie oraz zapisywania) raczej powinny być w zsynchronizowanym bloku, żeby nie stało się kuku i tak, dla bezpieczeństwa.


"A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, cooperate, act alone, solve equations, analyze a new problem, pitch manure, program a computer, cook a tasty meal, fight efficiently, die gallantly. Specialization is for insects." Robert Heinlein.
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:199
0

O to chodzi, żeby właśnie napisać coś na w miarę niskim poziomie i poćwiczyć synchronizowanie. Przyjdzie czas i na bardziej zaawansowane frameworki.
Liczę na odpowiedź na swoje pytania.

edytowany 1x, ostatnio: mielony
__krzysiek85
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 9 lat
  • Postów:1019
0

Czy muszę jakoś synchronizować zapis do pliku? Może jest takie zagrożenie, że jeden i ten sam wątek zacznął pisać po tym samym miejscu.

Od tego jest system operacyjny, aby zapewnić, że dwa równolegle zapisywane pliki nie nadpiszą się. Nic tutaj nie musisz synchronizować.

Twoje zadanie najprościej wykonać za pomocą puli wątków utworzonej poprzez Executors.newFixedThreadPool (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html), a następnie wykonanie zadań poprzez ExecutorService.invokeAll (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html)


Registered Linux user #456405 | SCJP 6 | SCWCD 5 | SCBCD 5
edytowany 1x, ostatnio: __krzysiek85
MI
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:199
0

dobrze, ale jeżeli będę miał pulę z określoną ilością wątków to jak to organizować, w sensie przydzielanie zadań do przetworzenia obrazu?

__krzysiek85
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 9 lat
  • Postów:1019
0

Nie musisz tego robić.
Wątki w puli same będą pobierać zadania do wykonania przekazane przez ExecutorService.invokeAll.


Registered Linux user #456405 | SCJP 6 | SCWCD 5 | SCBCD 5
edytowany 1x, ostatnio: __krzysiek85
datdata
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 7 lat
  • Postów:957
0
mielony napisał(a):

O to chodzi, żeby właśnie napisać coś na w miarę niskim poziomie i poćwiczyć synchronizowanie. Przyjdzie czas i na bardziej zaawansowane frameworki.
Liczę na odpowiedź na swoje pytania.

Im prędzej poznasz (dobrze) Java Collections i Guavę - tym lepiej dla Ciebie, serio. To trochę standard.


"A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, cooperate, act alone, solve equations, analyze a new problem, pitch manure, program a computer, cook a tasty meal, fight efficiently, die gallantly. Specialization is for insects." Robert Heinlein.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.