在我的测试 Android 应用程序中,我需要处理一个大文件,例如压缩、加密、纠删码等……
为了加快处理速度,我生成了多个线程,每个线程读取和处理文件,最后将结果合并/附加在一起。(使用 Java NIO)
我已经尝试过了,确实有一些加速,50% 或更多,具体取决于所涉及的存储技术。
关于这个有很多类似的 SO 问题,但他们主要讨论了由于单个旋转硬盘的限制,它不会如何提高 I/O 速度。
但就我而言,它是在使用闪存的多核 Android 设备上。
因此,我不确定加速是由于并行处理还是由于 RAM 中的缓存。
我的主要问题是:
我做对了吗?(因为我使用的是多核 Android 设备)
还是这种方法不好?坏在什么方面?
鉴于其他系统上的互操作性(压缩、加密)在这里不是问题。
更多细节:
我也不知何故使用了流水线的概念。
例如:
i) [Sequential] 压缩然后加密一个文件需要 10 + 20 = 30 秒,
ii) [Pipelining] 压缩文件的前半部分,压缩完成后立即开始加密。同时开始压缩文件的后半部分,最后在压缩完成后加密后半部分。可能只需要 20 秒。
(我知道这是一个不好的例子,但只是给出将存储技术应用于管道的想法)
我不确定这一点,但由于文件的每个块不依赖于前一个块(没有数据依赖问题),流水线文件应该没问题吧?