1BRC

16 views
Skip to first unread message

Matteo Vaccari

unread,
Jan 18, 2024, 2:09:56 AMJan 18
to JUG Torino - JVM User Group Torino

Hey gente avete sentito della 1 Billion Rows Challenge?  Si tratta di scrivere un programma Java che processa un csv di 1 miliardo di righe in meno di 10 secondi.

Io ho partecipato ma ho un risultato abbastanza scarso intorno ai 29 secondi, sulla macchina che usano per valutare le submission :-/.  Ho usato una memory map per leggere il file, l'ho diviso in N segmenti, uno per core e li processo in parallelo, e ho usato una macchina a stati per parsare il file nella maniera più efficiente che sono riuscito a immaginare.  Ho scritto il programma in maniera uguale sia in Java che in Go, e ho gli stessi tempi.

Vedo che quelli che riescono a stare sotto i 3 secondi (!) usano Unsafe per leggere la memoria direttamente, e parsano il file un long alla volta invece che un byte alla volta come faccio io.  

Mi chiedo se qualcuno in lista sta partecipando, e/o ci sono suggerimenti per attaccare il problema in maniera diversa




Matteo Vaccari

unread,
Jan 18, 2024, 2:16:09 AMJan 18
to JUG Torino - JVM User Group Torino
Una osservazione: l'hyperthreading funziona!  Ho sempre pensato che il mio macbook ha solo 6 processori veri, perché i 12 riportati dal runtime contano i processori virtuali che pensavo fossero una mezza bufala; ma ho verificato che se processo con 12 thread ottengo un tempo che è la metà di quello che ottengo con 6 thread.

Andrea Selva

unread,
Jan 18, 2024, 3:13:28 AMJan 18
to Matteo Vaccari, JUG Torino - JVM User Group Torino
Domanda banale, hai provato a profilarlo per capire dove spende più tempo, se nel processing nell'IO?
L'ottavo della lista era lo sviluppatore di Hazelcast Jet, e di dataflow processing ne sa parecchie credo, cmq sfida davvero interessante :-)

 Andrea


On Thu, Jan 18, 2024 at 8:09 AM Matteo Vaccari <matteo....@gmail.com> wrote:
--
Hai ricevuto questo messaggio perché sei iscritto al gruppo "JUG Torino - JVM User Group Torino" di Google Gruppi.
Per annullare l'iscrizione a questo gruppo e non ricevere più le sue email, invia un'email a jugtorino+...@googlegroups.com.
Per visualizzare questa discussione sul Web, visita https://groups.google.com/d/msgid/jugtorino/CADwhwbNtwy80BJORQ5SEgiQ1yWiSVpv8iqsXho1M_1OFXu1KTQ%40mail.gmail.com.

Matteo Vaccari

unread,
Jan 18, 2024, 3:28:30 AMJan 18
to Andrea Selva, JUG Torino - JVM User Group Torino

Ho profilato la versione Go -- il 90% del tempo era nella scansione del file un byte alla volta.  Tipo
  for (int i=0; i<data.length(); i++) { currentChar = data[i]; ...

Dario Balinzo

unread,
Jan 20, 2024, 3:39:35 AMJan 20
to Matteo Vaccari, Andrea Selva, JUG Torino - JVM User Group Torino
Potrebbe essere interessante far parlare al JUG qualcuno che è riuscito a stare sotto i 10 secondi, comparando qualche approccio :)

Io avevo visto la challenge qualche giorno fa e avevo solo provato a curiosare tra le varie soluzioni, ma non sono ancora sceso nei dettagli!

Dario

Reply all
Reply to author
Forward
0 new messages