Sto mantenendo un parser CSV ad alte prestazioni e cerco di sfruttare al massimo la tecnologia più recente per migliorare il throughput. Per questa particolare attività questo significa:Java: decodifica stream di carattere multithreading
- di memoria flash (Possediamo una scheda relativamente poco costoso PCI-Express, prestazioni 1 TB di storage che raggiunge 1 GB/s sostenuta leggere)
- più core (Possediamo un buon mercato Server Nehalem con 16 thread hardware)
La prima implementazione del parser CSV era a thread singolo. Lettura dei file, decodifica dei caratteri, divisione dei campi, analisi del testo, tutti all'interno della stessa discussione. Il risultato è stato un throughput di circa 50 MB/s. Non male ma ben al di sotto del limite di archiviazione ...
La seconda implementazione utilizza un thread per leggere il file (a livello di byte), un thread per decodificare i caratteri (da ByteBuffer a CharBuffer) e più thread da analizzare i campi (intendo l'analisi di campi di testo delimitati in doppi, interi, date ...). Funziona bene più velocemente, vicino a 400 MB/s sulla nostra scatola.
Ma ancora ben al di sotto delle prestazioni del nostro magazzino. E quelli SSD miglioreranno di nuovo in futuro, non stiamo sfruttando il massimo in Java. È chiaro che la limitazione corrente è la decodifica del personaggio (CharsetDecoder.read (...)). Questo è il collo di bottiglia, in un potente processore Nehalem trasforma i byte in caratteri a 400 MB/s, piuttosto buono, ma questo deve essere a thread singolo. Il CharsetDecoder è piuttosto statico, a seconda del set di caratteri utilizzato, e non supporta la decodifica multithread.
Quindi la mia domanda alla comunità è (e vi ringrazio per aver letto il post finora): qualcuno sa come parallelizzare l'operazione di decodifica del charset in Java?
Sfortunatamente, UTF-16 è una codifica a lunghezza variabile. È necessario UTF-32 per l'analisi semplice di Unicode. – grddev
@grddev - Ho trattato questo nel mio post - è possibile identificare sequenze di caratteri nel mezzo di flussi di dati UTF-16 - alte coppie di surrogati sono 0xD800-0xDBFF e surrogati bassi sono 0xDC00-0xDFFF. Qualsiasi altra cosa è contenuta in coppia di byte. – McDowell
Il mio commento si riferisce alla menzione di UTF-16BE. Non è possibile ritagliare completamente la decodifica. Ma è davvero molto semplice. – grddev