Java:多线程字符流解码
我正在维护一个高性能的CSV解析器,并尝试充分利用最新技术来提高吞吐量。对于此特定任务,这意味着:
- 闪存(我们拥有一个相对便宜的PCI-Express卡,1 TB的存储空间达到1 GB / s的持续读取性能)
- 多核(我们拥有一个便宜的Nehalem服务器,有16个硬件线程)
CSV 解析器的第一个实现是单线程的。文件读取,字符解码,字段分割,文本解析,所有这些都在同一线程中。结果是吞吐量约为 50MB/s。还不错,但远低于存储限制...
第二个实现使用一个线程来读取文件(在字节级别),一个线程来解码字符(从ByteBuffer到CharBuffer),并使用多个线程来解析字段(我的意思是将脱离的文本字段解析为双精度,整数,日期...)。这工作得更快,在我们的盒子上接近400MB / s。
但仍然远低于我们的存储性能。这些SSD将来会再次改进,我们在Java中没有充分利用它。很明显,当前的限制是字符解码( CharsetDecoder.read(...) )。这就是瓶颈,在功能强大的Nehalem处理器上,它以400MB / s的速度将字节转换为字符,这相当不错,但这必须是单线程的。字符集解码器有点有状态,具体取决于使用的字符集,并且不支持多线程解码。
所以我对社区的问题是(感谢你到目前为止阅读这篇文章):有人知道如何在Java中并行化字符集解码操作吗?