我测试了不同的 base64 编码器 mig64、iHarder、sun 等。似乎这些需要将整个数据存储在内存中进行转换。
如果我想以多线程方式对大于 1gb 的大文件(流)进行编码,可以使用哪种编解码器实现而不损坏文件?commons 编解码器似乎具有 base64outputstream 包装器。还有其他解决方案吗?
说清楚,我有一个1TB的文件,这个文件需要base64编码。机器内存2GB RAM,用Java最快的方法是什么?
我测试了不同的 base64 编码器 mig64、iHarder、sun 等。似乎这些需要将整个数据存储在内存中进行转换。
如果我想以多线程方式对大于 1gb 的大文件(流)进行编码,可以使用哪种编解码器实现而不损坏文件?commons 编解码器似乎具有 base64outputstream 包装器。还有其他解决方案吗?
说清楚,我有一个1TB的文件,这个文件需要base64编码。机器内存2GB RAM,用Java最快的方法是什么?
我不确定哪个编码器更快,您必须测量每个编码器才能确定。但是,您可以通过将文件分成块来避免内存问题并实现并发。只需确保将它们拆分为某个 6 字节边界(因为它在 Base64 中均匀地变成 8 个字节)。
我建议选择一个合理的块大小并使用一个ExecutorService
来管理固定数量的线程来进行处理。您可以RandomAccessFile
在他们之间共享一个并写入适当的位置。您当然必须计算输出块偏移量(只需乘以 8 并除以 6)。
老实说,虽然您可能没有意识到并发在这里有太多的性能提升。它可能会通过随机访问压倒硬盘驱动器。我将从使用单个线程将文件分块开始。先看看有多快。您处理 1GB 文件的速度可能比您想象的要快。作为一个粗略的猜测,我会在现代硬件上说 1 分钟,甚至写入你正在读取的同一个驱动器。