Il framework Fork / Join presenta una corrispondenza errata per l'API di Java 8 Streams?

6

Oggi ho trovato un articolo sulla piattaforma Fork / Join-Framework di Java8 e il suo utilizzo per l'implementazione dei flussi paralleli. Mentre capisco l'articolo, non sono del tutto sicuro di cosa dovrei pensare.

Fondamentalmente quello che dice che F / J in congiunzione con i flussi è quasi inutile, e specialmente nel contesto delle applicazioni JEE. Sono elencati alcuni argomenti specifici, come ad esempio:

  • it needs a massive volume of easily separable data (aggregate),
  • creates copious threads without regard for others,
  • has a high potential for stack overflows,
  • has a high potential for massive memory usage,
  • has a very, very narrow performance window,
  • is only designed for one request at a time.

Inoltre, fornisce questi argomenti contro l'approccio di decomposizione ricorsivo di F / J:

Recursive decomposition has an even narrower performance window. In addition to the above dynamic decomposition, recursive decomposition optimized for dyadic recursive division only works well:

  • on balanced tree structures (Directed Acyclic Graphs)
  • where there are no cyclic dependencies
  • where the computation duration is neither too short nor too long
  • where there is no blocking.

Poiché questa è l'unica fonte che ho potuto trovare che si lamenta di FJ, non sono sicuro che questo possa essere preso sul serio. I punti sopra citati o altri simili sono una preoccupazione valida?

Più specificamente, Oracle ha una posizione ufficiale riguardo ai limiti del Framework F / J applicato alla parallelizzazione dell'elaborazione dei flussi? In tal caso, ha in programma di fare qualcosa per loro?

    
posta Kr0e 10.07.2014 - 21:24
fonte

1 risposta

8

Questo è il nocciolo dei problemi con l'applicazione di F / J nell'implementazione dell'API di Streams:

  1. F / J è utile per la parallelizzazione di strutture in-memory, ad accesso casuale: vuole essere in grado di dividere il problema completo dall'alto verso il basso, dimezzandolo in modo ricorsivo in due sottoproblemi di uguale dimensione;
  2. il paradigma stream riguarda principalmente l'elaborazione di origini dati sequenziali materializzate pigramente, che possono essere divise in una sequenza di blocchi e il numero di blocchi è di solito non noto in anticipo.

Mentre F / J può essere un po 'piegato per supportare il chunking sequenziale, questo viene percepito come "anomalo" e "sbilenco", dando origine a problemi insormontabili quando combinato con l'imprevedibile latenza di I / O nella lettura di quei blocchi < sup> 1 .

L'API degli stream eccelle nella parallelizzazione delle strutture in memoria e di solito è utile con l'elaborazione di flussi pigri, supportati da I / O, ma fallisce quando si tenta di combinare queste due funzionalità in un singolo caso.

Se si dispone di un ciclo nel codice che introduce un collo di bottiglia legato alla CPU, è abbastanza probabile che questo ciclo stia iterando il contenuto di alcuni file, richieste di rete o righe di un set di risultati SQL. Nessuno di questi target per la parallelizzazione ottiene il supporto dall'API di Streams.

La posizione ufficiale è che questo caso d'uso non è supportato perché l'API di Streams ha un focus diverso, egualmente legittimo. Nel dipartimento dei flussi paralleli pigri, questo focus equivale a sorgenti di flusso che sono calcolate dai dati esistenti nella memoria di lavoro, con il vincolo aggiuntivo che queste fonti devono essere non ordinate -che ogni membro può essere calcolato indipendentemente, senza la necessità di calcolare prima un altro. Un esempio di tale flusso è un intervallo di numeri interi, ma un flusso di numeri casuali da un LCG è già al di fuori dell'area focalizzata sull'API, poiché questi numeri casuali possono essere generati solo in modo sequenziale.

1 Tieni presente che questa è l'istruzione ufficiale . Personalmente non ho ancora toccato questo problema, avendo invece parallelamente corretto l'elaborazione delle mie origini I / O.

    
risposta data 10.07.2014 - 22:38
fonte

Leggi altre domande sui tag