Skip to content

d3liaG/News-aggregator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Agregator de Știri (Java Multithreading)

Acest proiect implementează un agregator de știri eficient, utilizând concepte de paralelizare în Java. Obiectivul principal este procesarea rapidă a unui volum mare de articole din fișiere JSON, gruparea acestora, eliminarea duplicatelor și numărarea aparițiilor cuvintelor cheie, respectând constrângerea de a instanția thread-urile o singură dată.

Strategia de Paralelizare

Implementarea folosește modelul Replicated Workers și împarte munca în trei etape principale:

  • Faza 1: Prelucrarea fișierelor cu articole - Aceasta este cea mai costisitoare operație. Fiecare thread citește articolele din propriul fișier JSON, actualizând structurile globale (titluri, UUID-uri, limbi, categorii, autori) și adăugând articolele într-o listă partajată.

  • Faza 2: Procesarea cuvintelor cheie - După eliminarea duplicatelor, lista de articole este împărțită în bucăți egale (chunks). Fiecare thread preia un chunk, extrage cuvintele semnificative (ignorând linking words) și actualizează contorul global pentru fiecare cuvânt.

  • Faza 3: Sortarea finală - Operațiunile de sortare a articolelor și a keyword-urilor, fiind costisitoare, sunt delegate unor thread-uri separate.

Concepte și Structuri de Date Utilizate

Pentru a asigura o execuție corectă și fără race conditions, proiectul minimizează sincronizarea manuală prin utilizarea de structuri thread-safe și unelte standard Java:

  • ExecutorService: Creează un pool fix de thread-uri reutilizabile pentru toate task-urile. Se folosește submit() pentru alocarea task-urilor și Future.get() pe post de barieră de sincronizare între etape.

  • ConcurrentHashMap: Utilizat pentru a ține evidența câmpurilor (titluri, UUID, autor, limba, categorii) și a articolelor în care apar, prevenind problemele de concurență.

  • Collections.synchronizedList: Protejează lista globală în care toți workerii adaugă articolele citite.

  • AtomicInteger: Folosit pentru incrementarea atomică (ex. incrementAndGet()) la contorizarea autorilor și a cuvintelor cheie, evitând coliziunile.

Performanță și Scalabilitate

Proiectul a fost testat pe un set de date generos (60.340 de articole) folosind un procesor AMD Ryzen 7 7840HS (8 nuclee / 16 fire de execuție).

  • Timp de execuție secvențial (1 thread): ~46.81 secunde

  • Timp optimizat (4 thread-uri): ~19.37 secunde

  • Speedup maxim atins: ~2.42x

Arhitectura scalează eficient până la 3-4 thread-uri, punct în care performanța se plafonează din cauza porțiunilor secvențiale inevitabile (citirea de pe disc, sortările finale) și a overhead-ului de sincronizare. Numărul optim de thread-uri pentru acest setup este 4.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors