1

我對應用操作(獨立地)到Java Array中的每個元素的方法感興趣。例如,將數值數組的每個元素剪裁爲不超過給定元素。Efficient/Parallel對Java中的數組中的每個元素應用操作<= 1.7?

實施例:

myArray.clip(5) 

或者

Utils.clip(myArray, 5) 

woud設置的每個元件大於5爲5

最直接的方法是迭代的元素,但我不t喜歡它有兩個原因:

  • 它是迭代的,不剝削parrallization機會
  • 的代碼看起來不漂亮,映射或vecotorized語法會更好

我需要做這樣的裁剪操作約5000次,每次時間在70 X 10(2D陣列)上

如果Java < = 1.7不提供在標準庫中執行此操作的方法。我如何使用其他庫或Java 1.8功能實現我想要的功能(以上兩點)。

+1

對於Java 8,您可能需要查看Arrays.parallelSetAll。例如:'Arrays.parallelSetAll(arr,i - > arr [i]> 5?5:arr [i]);' –

+0

..否則您可以創建自己的方法。將數組分成相等的塊大小,然後在每個塊上應用該操作(由獨立線程處理的塊)。由於你的要求是無狀態的,這不應該很難實現。 –

+0

在同一陣列或5000個不同陣列上5000次? (如果它是5000個不同的數組,它可能(!)將這些操作放入一個'ExecutorService'中更有效率,每個數組對應一個)。否則:它會一直是二維數組嗎?它會一直是'int'數組嗎?所有這些都會影響這項任務的適當「基礎設施」會是什麼樣子...... – Marco13

回答

1

傳統的Java 7的技術爲運營並行集合中的數據是「分叉/連接」模式。這個概念是人們將工作分解成更小的部分,分派完成這些部分的任務,然後結束每個任務。

雖然我不確定你的情況是否可以保證。根據「剪輯」操作的複雜程度,創建一對線程可以更直接地同時在兩個軸上進行操作。儘管如此,我可能會誤解你的要求。

另一種解決方案可能是時間/空間折衷。在更新主要集合時維護數據的剪輯版本可能更有用。對生產者 - 消費者模型進行排序,其中有些內容會查找對集合的更改,並維護一個裁剪版本。

+0

有一個優化器,通過一些智能和一些處理矩陣的隨機性,然後評估該矩陣,然後將評估加矩陣賦予優化器,然後優化器操縱矩陣。根據優化問題的一些約束,我可以告訴優化器操縱矩陣,所以沒有大於x的值。這就是我需要裁剪的地方。 – StaticBug

+0

我來自Python背景。我使用Numpy等。因此習慣了簡潔的語法。 – StaticBug

0

使用Java 8的功能,這是我如何去做的,我迭代了行並對它進行了並行操作。我沒有找到任何標準方法,需要一個

double [] [] 

,並把它作爲一個流或

parallelSetAll(double [] [] ...) 

我的代碼,我使用Apache的commons-數學庫爲我的矩陣實現,因爲它提供基於庫中實現的RealMatrix類型的實用函數

這個代碼可以被進一步優化,而不必過多地執行級別。喜歡拿出for循環或稍後做任務,等等。

public static RealMatrix clipLower(RealMatrix m, double lowerBound){ 
     // TODO see if you really need to modify m or just return a modified copy of m 

     //process the matrix row by row, each row gets processed in parallel 
     // TODO See if you can directly parallelize on the entire matrix not row by row 
     // OPEN implement using Arrays.parallelSetAll Method? 
     int nrOfRows = m.getRowDimension(); 

     for(int i = 0; i < nrOfRows; i++){ 
      // TODO move the declaration outside the for loop 
      double[] currRow = m.getRow(i); 
      double[] newRow = Arrays.stream(currRow) 
            .parallel() 
            .map((number) -> (number < lowerBound) ? lowerBound : number) 
            .toArray(); 
      m.setRow(i, newRow); 
     } 

     return m; 
    } 
相關問題