C'è un modo per ricevere un Stream<String> stream
su un BufferedReader reader
tale che ogni stringa in stream
rappresenta una linea di reader
con l'ulteriore condizione che stream
viene realizzato direttamente (prima reader
leggi tutto)? Voglio elaborare i dati di stream
in parallelo per ottenerli da reader
per risparmiare tempo.Convertire `BufferedReader` a` `Flusso <String> in modo parallelo
Modifica: desidero elaborare i dati parallelamente alla lettura. Non voglio elaborare linee diverse parallele. Dovrebbero essere elaborati in ordine.
Facciamo un esempio su come voglio risparmiare tempo. Diciamo che il nostro reader
presenterà 100 linee per noi. Occorrono 2 ms per leggere una riga e 1 ms per elaborarla. Se prima leggo tutte le righe e poi le elaboro, mi occorreranno 300 ms. Quello che voglio fare è: non appena viene letta una riga, voglio elaborarla e leggere in parallelo la riga successiva. Il tempo totale sarà quindi di 201 ms.
Quello che non mi piace di BufferedReader.lines()
: Per quanto ho capito la lettura inizia quando voglio elaborare le linee. Supponiamo di avere già il mio reader
, ma devo fare precomputazioni prima di poter elaborare la prima linea. Diciamo che costano 30 ms. Nell'esempio sopra il tempo totale sarebbe quindi di 231 ms o 301 ms utilizzando reader.lines()
(puoi dirmi quale di quelle volte è corretta?). Ma sarebbe possibile portare a termine il lavoro in 201 ms, dal momento che le precomputazioni possono essere eseguite parallelamente alla lettura delle prime 15 righe.
Marko Topolnik ha scritto un wrapper spliterator che consente di variare le dimensioni del batch: http://stackoverflow.com/a/22575506/1441122 –