1

私のテスト用 Android アプリケーションでは、圧縮、暗号化、消去エンコードなどの大きなファイルを処理する必要があります。プロセス
を高速化するために、複数のスレッドを生成し、各スレッドがファイルの異なる部分を読み取って処理します。ファイルを作成し、最後に結果を一緒にマージ/追加します。(Java NIO を使用)

私はすでにそれを試しましたが、実際には、どのストレージ技術が関係しているかに応じて、50% 以上のスピードアップが見られました。
これには多くの同様のSOの質問がありますが、主に単一回転ハードディスクの制限によりI / O速度が向上しないことについて議論しました。
しかし、私の場合は、フラッシュ メモリを使用するマルチコア Android デバイス上にあります。
したがって、高速化が並列処理によるものなのか、RAM へのキャッシュによるものなのかはよくわかりません。

私の主な質問は次のとおりです。
私は正しいことをしていますか? (私はマルチコアのAndroidデバイスを使用しているため)
またはこの方法は悪いですか?何の点で悪いですか?
ここでは、他のシステムでの相互運用性 (圧縮、暗号化) は問題ではありません。

詳細:
また、どういうわけかパイプラインの概念も使用しています。
例:
i) [シーケンシャル] ファイルを圧縮してから暗号化すると、10 + 20 = 30 秒かかります。
ii) [パイプライン] ファイルの前半を圧縮し、圧縮が完了したらすぐに暗号化を開始します。同時に、ファイルの後半の圧縮を開始し、圧縮が完了したら、最後に後半を暗号化します。20秒しかかからないかもしれません。
(これは悪い例だと思いますが、ストレージ技術をパイプラインに適用するという考えを示すためです) これについてはよくわかり
ませんが、ファイルの各チャンクは前のチャンクに依存しないため (データ依存性の問題はありません)、ファイルのパイプライン処理は問題ないはずです。

4

1 に答える 1

2

実際にプログラムを高速化するかどうかは、多くの要因に依存します。これには、ファイルが RAM またはディスク上にあるかどうかが含まれます。ディスク上のプログラムが IO バウンドまたは CPU バウンドの場合 (IO バウンドの場合は役に立ちません)。OS のスケジューラは実際にスレッドをどのように割り当てますか? それらを同じコアまたは複数のコアに割り当てますか? さまざまなスレッドが対話する必要がありますか (スレッドがロックされた状態で長時間待機しているため、速度が向上しないか、非常にバグが多いですか)?

あなたのテクニックは、並列処理のかなり標準的なものです。アプリに適しているかどうかにかかわらず、かなりの実装と確認が必要です。

于 2013-08-11T21:56:48.960 に答える