Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Google ha appena rinnovato la sua celebre serie A con il Pixel 10a, lo smartphone della serie più conveniente se consideriamo il rapporto tra costo e prestazioni. Con il chip Tensor G4, un design raffinato soprattutto sul retro e l'integrazione profonda di Gemini, il colosso di Mountain View promette un'esperienza premium a un prezzo accessibile. E il retro non ha nessuno scalino
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026
Al MWC Qualcomm annuncia una coalizione industriale per lanciare il 6G entro il 2029 e introduce agenti IA per la gestione autonoma della RAN. Ericsson, presente sul palco, conferma la direzione: le reti del futuro saranno IA-native fin dalla progettazione
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso
CHUWI CoreBook Air è un ultraleggero da 1 kg con Ryzen 5 6600H, display 14" 16:10 e 16 GB LPDDR5. Offre buona portabilità, autonomia discreta e costruzione in alluminio, ma storage PCIe 3.0 e RAM saldata limitano l'espandibilità. A 549 euro sfida brand più noti nella stessa fascia di mercato.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-10-2015, 12:18   #1
specialdo
Member
 
Iscritto dal: Jan 2007
Messaggi: 127
[JAVA] Implementazione multithread con scrittura su file

ciao a tutti
sto scrivendo un programma in java che prendendo un file csv in input, per ogni riga, la legge e calcola qualcosa. il risultato viene messo in una lista e ogni 1000 righe (quindi ogni 1000 risultati) scrivo la lista in un altro file csv e la svuoto e così via fin quando non termino di leggere tutto il csv.

i tempi di elaborazione sono troppo lunghi dato che i csv sono enormi quindi vorrei usare i thread.

mi conviene far partire un thread per ogni riga del csv?
come faccio a mantenere la scrittura su csv ogni 1000 righe? quale thread andrà a scrivere su csv? l'ultimo che arriva a 1000?

cosa fondamentale è mantenere l'ordine delle righe. cioè la riga 1 del csv in output deve corrispondere al risultato della riga 1 del csv in input.

si accettano consigli.. grazie!
specialdo è offline   Rispondi citando il messaggio o parte di esso
Old 09-10-2015, 15:25   #2
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da specialdo Guarda i messaggi
ciao a tutti
sto scrivendo un programma in java che prendendo un file csv in input, per ogni riga, la legge e calcola qualcosa. il risultato viene messo in una lista e ogni 1000 righe (quindi ogni 1000 risultati) scrivo la lista in un altro file csv e la svuoto e così via fin quando non termino di leggere tutto il csv.

i tempi di elaborazione sono troppo lunghi dato che i csv sono enormi quindi vorrei usare i thread.
I calcoli sono pesanti? I tempi lunghi sono semplicemente dovuti solo alla dimensione dei file csv oppure anche ai conti?

Quote:
Originariamente inviato da specialdo Guarda i messaggi
mi conviene far partire un thread per ogni riga del csv?
In linea di principio, no. La creazione e la distruzione di thread hanno dei costi, quindi rallenteresti tutto il mestiere.

Suggerimento (se ovviamente i calcoli hanno un buon peso nell'elaborazione):
- fai un thread che legge dal file di ingresso. Da quanto ho capito, leggi una riga per volta, quindi questo thread (lo chiamiamo T_IN) semplicemente legge una riga alla volta e la mette (insieme al numero di linea letto) in una coda, realizzata utilizzando una ArrayBlockingQueue<>.
Ovviamente ti devi creare un piccolo oggetto che possa memorizzare la linea ed il suo numero, poi inserirai questo oggetto nella coda;

- la coda sara' letta da un altro thread, preposto al processamento della linea. Lo chiamerai T_PROC. Questo thread semplicemente legge dalla coda, fa quello che deve fare e scrive il risultato in UN'ALTRA coda, sempre di tipo ArrayBlockingQueue<>.
Qual e' il vantaggio? Semplice: ho scritto the T_PROC e' un thread. In realta' ne puoi lanciare parecchie copie! Normalmente si considera una buona soluzione lanciarne un numero pari al doppio del numero di core che il tuo processore/processori ha a disposizione.
Tutti questi thread lavoreranno sulla stessa coda. Quando c'e' una nuova linea da processare, uno di questi partira' a fare il suo lavoro e gli altri aspetteranno una nuova linea.
Se il tempo di computazione e' piuttosto lungo, sarai nella fortunata situazione nella quale TUTTI i tuoi thread stanno lavorando contemporaneamente su core diversi (o quasi, visto che i thread sono piu' dei core). Se invece il tempo di computazione e' basso rispetto a quello di lettura, hai buttato il tuo tempo. Pazienza

Tutti questi thread scriveranno ancora sulla stessa coda di uscita. Ovviamente avranno dei tempi di elaborazione diversi, quindi i dati in questa coda NON sono ordinati. Ma hai il numero di linea a disposizione e puoi ricostruire l'ordine giusto.

- l'ultimo thread e' T_OUT, il quale legge la coda di uscita, mette i dati in ordine e li salva.
Domanda: come metterli in ordine? Evita di leggere la coda, mettere tutto in un array ed ordinare l'array, e' uno spreco enorme di tempo.
Piuttosto, visto che hai il numero di linea, puoi mettere le linee che arrivano in un array, direttamente nel posto giusto, e salvare a blocchi.
Oppure puoi salvare linea per linea, quando le trovi nell'ordine giusto, ritardando il salvataggio quando la linea precedente deve ancora arrivare.
Pero' in questo caso devi confidare nel fatto che il file di uscita sia bufferizzato, altrimenti parecchie scritture piccole ti faranno aumentare i tempi (tranquillo, java ti mette a disposizione il BufferedOutputStream e altre cose)
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 13-10-2015, 16:56   #3
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Per capire se può essere conveniente parallelizzare basta utilizzare un monitor di risorse (il task manager può essere sufficiente), se un singolo core è utilizzato al 100% allora aumentare il numero dei thread ti consente di sfruttare anche gli altri core. L'implementazione suggerita da sottovento è adeguata.

Se nessun core è utilizzato in maniera significativa allora il problema è tutto sul disco, in questo caso puoi:
1) lavorare su dati compressi ed eseguire la decompressione/compressione direttamente in memoria, in questo modo avrai ovviamente un forte overhead sulla cpu ma riuscirai a sfruttare pienamente il disco; naturalmente ha senso solo se i dati di origine sono già compressi o se lo step successivo è proprio quello di comprimere l'output;
2) comprare dischi più performanti e/o adottare soluzioni raid.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta Recensione Google Pixel 10a, si migliora poco ma...
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026 6G, da rete che trasporta dati a rete intelligen...
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso CHUWI CoreBook Air alla prova: design premium, b...
Roborock Saros 20: il robot preciso e molto sottile Roborock Saros 20: il robot preciso e molto sott...
ASUS ROG Kithara: quando HIFIMAN incontra il gaming con driver planari da 100mm ASUS ROG Kithara: quando HIFIMAN incontra il gam...
MacBook Neo: nessuna sorpresa nei primi ...
La serie POCO X8 Pro è pronta al ...
Smartphone: 2026 difficile per il mercat...
Star Wars: Knights of the Old Republic R...
Huang, NVIDIA: OpenClaw ha realizzato in...
Annunciano il recupero di 4,8 milioni di...
Oggi degli ottimi auricolari Sony con ca...
Muffa in casa? Questo deumidificatore da...
Sonos Era 100: il punto d'ingresso per u...
"Non stiamo sostituendo nessuno con...
Tutti i robot in offerta ora: prezzi bas...
Fra 3 giorni, a mezzanotte, Amazon attiv...
Il principale limite del MacBook Neo &eg...
899€ in tutti i colori, crolla il prezzo...
Sempre più pubblicità su Y...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 16:32.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v