Conversione da ListObject a Array con thread

0

Ho una grande lista (> 500.000) di oggetti e voglio convertirla in una matrice multidimensionale. Fino ad ora lo sto facendo usando un ciclo for, ma dopo alcune misurazioni ho identificato che questo è un collo di bottiglia per il mio programma.

Sto considerando di effettuare la conversione in parallelo usando un executor del pool di thread. La logica è che se ho thread N dividerò i dati iniziali in blocchi N. Ogni thread "converte" i valori dell'oggetto e li inserisce nell'array "condiviso". Poiché conosco la posizione esatta di ciascun elemento, posso assicurarmi che 2 thread non tenteranno mai di scrivere nella stessa posizione di array.

È un buon modo per andare? Ci sono delle considerazioni?

Esistono librerie che implementano tali funzionalità? (Nota: non sto chiedendo le librerie da sé, dato che questo sarebbe argomento. Voglio solo sapere, se c'è qualcosa di simile, il che significa che sono nella buona strada)

Nota 1: so che creare thread è anche "dispendioso in termini di tempo", ma per trovare l'importo_del_data / numero_di_thread, la conversione parallela è più ottimale di quella seriale è un altro problema.

    
posta Athafoud 25.05.2015 - 16:55
fonte

1 risposta

4

Per me sembra piuttosto semplice - come dici tu, puoi dividere il lavoro in precedenza in N pezzi, ogni thread prenderà ed elaborerà i loro elementi assegnati e li metterà in posizione predeterminata nell'array - i thread in modo efficace non lo faranno leggi / scrivi gli stessi dati.

Due cose però:

  • Si dovrebbe preallocare tutti gli array a cui si accede da più thread prima della mano per evitare condizioni di gara.
  • Esiste un potenziale problema di visibilità: i dati condivisi sono talvolta memorizzati nella cache, localmente nei registri della CPU, le loro modifiche non devono essere immediatamente propagate alla memoria principale. Il rischio è che, una volta apportate tutte le modifiche nei thread "worker", queste modifiche potrebbero non essere visibili (presenti nella memoria principale) per il thread che utilizza l'array multidimensionale prodotto. Ci sono diversi modi possibili su come gestirlo per questo caso, ma probabilmente il più semplice è usare java.util.concurrent.atomic.AtomicReferenceArray invece di un semplice array - questo risolverà i problemi di visibilità senza dover ragionare su cosa sta succedendo.
risposta data 25.05.2015 - 17:54
fonte

Leggi altre domande sui tag