【发布时间】:2010-08-09 08:39:10
【问题描述】:
我正在维护一个高性能 CSV 解析器,并尝试充分利用最新技术来提高吞吐量。对于这个特定的任务,这意味着:
- 闪存(我们拥有相对便宜的 PCI-Express 卡,1 TB 的存储空间,可达到 1 GB/s 的持续读取性能)
- 多核(我们拥有一台具有 16 个硬件线程的廉价 Nehalem 服务器)
CSV 解析器的第一个实现是单线程的。文件读取、字符解码、字段拆分、文本解析,都在同一个线程中。结果是大约 50MB/s 的吞吐量。不错,但远低于存储限制...
第二种实现使用一个线程读取文件(在字节级别),一个线程解码字符(从ByteBuffer到CharBuffer),以及多个线程解析字段(我的意思是将分隔的文本字段解析为双精度,整数,日期...)。这在我们的机器上运行得更快,接近 400MB/s。
但仍远低于我们存储的性能。那些 SSD 将来会再次改进,我们并没有在 Java 中充分利用它。很明显,当前的限制是字符解码( CharsetDecoder.read(...) )。这就是瓶颈,在强大的 Nehalem 处理器上,它以 400MB/s 的速度将字节转换为字符,非常好,但这必须是单线程的。 CharsetDecoder 在某种程度上是有状态的,取决于使用的字符集,并且不支持多线程解码。
所以我向社区提出的问题是(感谢您到目前为止阅读这篇文章):有人知道如何在 Java 中并行化字符集解码操作吗?
【问题讨论】:
标签: java multithreading character-encoding