2016-12-31 6 views
1

私の主題論文では、虹彩認識データを分析する必要があります。したがって、約400のテンプレートが作成されています。これらのテンプレートのそれぞれは、お互いのテンプレートと比較されなければなりません。その結果、約160,000の結果が一致します。Android start 160.000 AsnycTasks

これらの結果は、Azure Easy Tableにアップロードする必要があります。私は、ThreadPoolExecutorが128以上のスレッドを並列に処理できないため、どこから開始するのか本当に分かりません。

このようなことを行う正しい方法は何ですか?時間は本当に問題ではありません。

これは私の現在のアプローチです:

for (int i = 0; i < mIrisEntries.size(); i++){ 
    match(i); 
} 

public void match(final int position) { 
    IrisEntry inputEntry = mIrisEntries.get(position); 

    // takes about 10ms 
    List<IrisResult> results = mUSITHelper.matchEntries(inputEntry, mIrisEntries, this); 

    for (IrisResult s : results) { 
     try { 
      Thread.sleep(1000); 
      mAzureTableManager.addIrisResult(s); // here the AsyncTask is started 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

このアプローチはいくつかの時間のために働きます、。システムはすべてのスレッドを強制終了し、アップロードはキャンセルされます。

+0

160,000件の結果の1つを処理するのにどれくらい時間がかかりますか?または、好きな場合は、一度に1つずつ、16万の結果をすべて処理するにはどのくらいの時間がかかりますか? – CommonsWare

+0

あなたが処理することによって、1つの結果のアップロードまたは作成を意味しますか? 2つのテンプレートのマッチングには約10秒かかります – 4ndro1d

+0

「処理することで、アップロードまたは1つの結果の作成を意味しますか?」 - 私はあなたのアプリを知らないので、私は知らない。 Azureのアップロード操作は、160,000件の一致する結果の*ごとに1回行っていますか?あるいは、160,000試合の終わりに1つをしていますか?それとも別のもの(バッチでアップロードするなど)ですか? – CommonsWare

答えて

1

質問やコメントに記載されている内容を完全に守っているわけではありません。

しかし、処理時間(私が理解していれば約30分)で、フォアグラウンドサービスを使用する必要があります。そのサービスでは、独自のThreadPoolExecutorを使用し、プール内のスレッド数をCPUコアの数に基づいて調整します。理想的には、私はそのエグゼキュータに〜160,000のジョブをポストしませんが、それらの400のジョブのそれぞれがあなたのテンプレートの1つに対して作業を実行する400ではなく400です。エグゼキュータに投稿した最後のジョブは、最終的なクリーンアップを行い、サービスを停止します。

また、作業を半分にすることができます。 AとBが2つのテンプレートであるとします。 AとBを比較するのがBとAを比較するのと同じ場合、両方の比較を行う必要はありません。あなたの400個のテンプレートは〜160,000のジョブに拡大しているようですが、AとB、BとAをすべてのペアで比較しているようです。

0

@CommonsWareによると、アップロードのリクエスト数を減らすためには、データサイズが&だと思います。

私の経験上、非同期にデータをアップロードすることについては考慮する必要はありませんので、私の経験上、enable offline syncにあなたのアンドロイドアプリを試してみることをお勧めします。

希望します。

+0

オフライン同期を有効にしましたが、非常にバグがあります。 – 4ndro1d