2014-01-27 158 views
5

在我的節目,我基本上有類似的方法:多線程Java的

for (int x=0; x<numberofimagesinmyfolder; x++){ 
    for(int y=0; y<numberofimagesinmyfolder; y++){ 
     compare(imagex,imagey); 
     if(match==true){ 
      System.out.println("image x matches image y"); 
     } 
    } 
} 

所以基本上我有一個圖像文件夾,我比較圖像的所有組合......所以比較像1對所有圖像,然後圖像2 ...等等。我的問題是搜索時看到什麼圖像匹配,需要很長時間。我正在嘗試多線程這個過程。有沒有人有任何想法如何做到這一點?

+0

你是通過一些參數比較還是兩個圖像一般都要相等? – Autocrab

回答

3
  1. 內循環應該從y = x + 1開始以利用對稱性。
  2. 首先將所有圖像加載到內存中。不要做所有的磁盤比較。
  3. 使用Java ExecutorService(基本上是一個線程池)。爲所有索引組合排隊任務。讓線程將索引組合從任務隊列中拉出並執行比較。

下面是一些通用代碼做多線程:

public static class CompareTask implements Runnable { 
    CountDownLatch completion; 
    Object imgA; 
    Object imgB; 

    public CompareTask(CountDownLatch completion, Object imgA, Object imgB) { 
     this.completion = completion; 
     this.imgA = imgA; 
     this.imgB = imgB; 
    } 

    @Override 
    public void run() { 
     // TODO: Do computation... 

     try { 
      System.out.println("Thread simulating task start."); 
      Thread.sleep(500); 
      System.out.println("Thread simulating task done."); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     completion.countDown(); 
    } 
} 

public static void main(String[] args) throws Exception { 
    Object[] images = new Object[10]; 

    ExecutorService es = Executors.newFixedThreadPool(5); 

    CountDownLatch completion = new CountDownLatch(images.length * (images.length - 1)/2); 

    for (int i = 0; i < images.length; i++) { 
     for (int j = i + 1; j < images.length; j++) { 
      es.submit(new CompareTask(completion, images[i], images[j])); 
     } 
    } 

    System.out.println("Submitted tasks. Waiting..."); 
    completion.await(); 
    System.out.println("Done"); 

    es.shutdown(); 
} 
8

而不是比較每一次的圖像,散列圖像,保存哈希,然後比較各對消息的散列。由於哈希值要小得多,所以可以將更多內容放入內存和緩存中,這將顯着加快比較速度。

可能有更好的方式來進行平等搜索,但一種選擇是將所有哈希值粘貼到一個數組中,然後通過哈希值對它們進行排序。然後遍歷列表尋找相等的相鄰條目。這應該是O(n*log(n))而不是像您當前的版本O(n^2)

+0

取決於你使用哪一個散列,你可能想要實際比較它們之間的相等性(使用SHA-256或類似的機會雖然可以忽略不計)。也可以使用'HashMap >'使其成爲'O(n)'。對於大多數情況,除了從散列計算中分離IO之外,大多數情況下甚至不值得多線程化。 – Voo