2016-12-31 46 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個結果中的一個需要多長時間?或者,如果您願意,您需要多長時間來處理所有160,000個結果,一次完成一項? – CommonsWare

+0

通過處理您的意思是上傳或創建一個結果?兩個模板的匹配需要大約10 ms – 4ndro1d

+0

「通過處理你的意思是上傳或創建一個結果?」 - 我不知道,因爲我不知道你的應用程序。你是否對160,000個匹配結果中的每一個進行一次Azure上傳操作?或者你在所有160,000場比賽結束時做了一場?還是其他的東西(例如,分批上傳)? – CommonsWare

回答

1

我不完全遵循你在問題和意見中描述的所有內容。

但是,在處理時間(如果我理解你的時間約爲30分鐘),你需要使用前臺服務,否則你的進程可能無法存活那麼久。在該服務中,使用您自己的ThreadPoolExecutor,根據CPU內核數調整池中的線程數。理想情況下,我不會向該執行者發佈大約160,000個工作,而是400個,這400個工作中的每一個都爲您的模板之一執行工作。您發佈給執行者的最後一份工作是做最後的清理工作,並停止服務。

此外,您可能可以將您的工作減半。假設A和B是你的兩個模板。如果比較A到B與將B比較到A相同,則不需要進行兩個比較。你的400個模板擴展到約160,000個工作似乎意味着你正在比較A到B和B到A的所有對。

0

作爲@CommonsWare說,我認爲這是一個好主意,可以減少上傳請求的數量&的數據大小。

但是,根據我的經驗,我建議您需要嘗試enable offline sync爲您的Android應用程序,以便不需要考慮異步上傳數據的問題。

希望它有幫助。

+0

我已啓用脫機同步,但它是非常錯誤的.. – 4ndro1d