在我的测试Android应用程序中,我需要处理一个大文件,如压缩,加密,擦除编码等... 为了加速进程,我生成多个线程,每个线程读取并处理文件的不同部分,最后合并/追加结果。 (使用Java NIO)
我已经尝试了它,并且实际上有一些加速,50%或更多,具体取决于所涉及的存储技术
这个问题有很多类似的问题,但他们主要讨论了由于单旋转硬盘的限制,它不会如何提高I / O速度。
但在我的情况下,它是在使用闪存的多核Android设备上
因此,我不确定加速是由于并行处理还是由于RAM中的缓存。
我的主要问题是:
我做对了吗? (因为我在多核Android设备上)
或者这种方法不好?什么不好?
鉴于此处不关心其他系统的互操作性(压缩,加密)。
更多细节:
我也以某种方式使用流水线的概念
例如:
i)[顺序]压缩然后加密文件将需要10 + 20 = 30秒,
ii)[Pipelining]压缩文件的前半部分,在压缩完成后立即开始加密。同时,开始压缩文件的后半部分,最后在压缩完成后加密后半部分。可能只需要20秒
(我知道这是一个不好的例子,但只是为了将存储技术应用到管道中)
我不确定这一点,但由于文件的每个块都不依赖于前一个块(没有数据依赖性问题),管道传输文件应该没问题呢?
答案 0 :(得分:2)
它是否真的会加速你的程序取决于很多因素。这包括 - 是RAM中还是磁盘上的文件?如果它在磁盘上是程序IO绑定或CPU绑定(如果IO绑定,那么它将没有帮助)?操作系统的调度程序如何实际分配线程 - 它是将它们分配给相同的核心还是多个核心?不同的线程是否需要进行交互(它们是否会等待锁定很长时间以至于它不是加速或非常错误)?
您的技术是并行处理的标准技术。它是否适合您的应用程序需要相当多的实施和检查。