2011-04-14 64 views
0

我测试了不同的base64编码器mig64,iHarder,sun等。似乎这些需要将整个数据存储在内存中进行转换。java中最好的多部分base 64编码器是什么?

如果我想以多线程的方式编码一个大文件(流)> 1GB,可以在不破坏文件的情况下使用哪个编解码器实现? commons编解码器似乎有base64outputstream包装。其他解决方案?

为了说清楚,我有一个1TB文件,而这个文件需要编码base64。机器内存2GB内存,在Java中最快的方法是什么?

+0

因此,您对“最佳”的特定定义是“能够对流进行编码”? – 2011-04-14 18:38:53

+0

你有其他的标准吗?正如目前所写,这个问题是主观的(来自标题)和/或“X列表”请求(基于最后一部分)。 – Pops 2011-04-14 18:40:09

+0

以并发的方式....让它成为文件ie。固定的字节流 – zudokod 2011-04-14 18:41:30

回答

1

我不确定哪个编码器速度更快,您必须测量每个编码器以确定。但是,您可以通过将文件拆分为块来避免内存问题并实现并发性。只要确保将它们分割成6个字节的边界(因为它在Base64中平均变为8个字节)。

我建议选择合理的块大小,并使用ExecutorService来管理固定数量的线程来完成处理。你可以在他们之间分享RandomAccessFile并写入适当的地方。您当然必须计算输出块偏移量(只需乘以8并除以6)。老实说,虽然你可能没有意识到这里有很多并发的性能增益。它可能会随机访问硬盘驱动器。我将首先使用单个线程分块文件。看看这是多快第一。您可能会比您想象的更快地收缩1GB文件。作为一个粗略的猜测,我会在现代硬件上说1分钟,甚至写到你正在阅读的同一个驱动器。

+0

如何确保完整性,在76个字符之后换行后再说等等? – zudokod 2011-04-14 18:51:05

+0

我不会在换行符上分割它,你需要在固定的字节边界上分割。如果你逐行阅读,那么你不能保证每行是6字节的倍数。 – WhiteFang34 2011-04-14 18:54:07

+0

我的意思是写......输出应该有规格,在76之后换行更大的块。即文件被转换为另一个有字符的文件,根据规范 – zudokod 2011-04-14 18:58:35