2017-10-09 78 views
0

我想分手了大量的數據,例如,有沒有辦法使用它像這樣(在Java中):有沒有辦法在Java中並行拆分和連接多個數據?

idList.parallelStream() 
    .splitCount(20) 
    .eachMap((splitedIdList) -> dao.list(splitedIdList)) 
    .aggregate() 
    .collect(Collectors.toList()); 

有沒有辦法來解決這個問題是使用流還是其他圖書館?

+3

當然,但你爲什麼要這樣做?假設你的dao訪問數據庫,所以並行執行並不會提高性能。它會傷害它。 – Kayaman

+0

DUPE https://stackoverflow.com/questions/27583623/is-there-an-elegant-way-to-process-a-stream-in-chunks – tbsalling

+1

@Kayaman謝謝,就我而言,'idList'很大(最大10,000)和'dao.list()'的sql是'SELECT * FROM table WHERE id IN(...)'。在這種情況下它不會提高性能嗎? –

回答

0

雖然@Kayaman的言論非常相關,但我認爲你要找的是java.util.Spliterator<T>

用於遍歷和分區源元素的對象。由Spliterator覆蓋的元素的源可以是例如 陣列,集合,IO通道或生成器函數。

Spliterator可以批量地逐個遍歷元素(tryAdvance())或 (forEachRemaining())。

甲Spliterator也可以在分區關閉它的一些元件(使用 trySplit)作爲另一Spliterator,以便在可能的並行 操作中使用。使用不能分割的Spliterator進行操作,或者如果以高度不平衡或低效的方式進行操作,則不太可能從並行性中受益。穿越和分裂排氣元件; 每個Spliterator僅適用於單個批量計算。

該類的JavaDoc非常複雜,包括一個關於如何實現和使用Spliterator的示例。

-1

下面是一個簡單的解決方案我fork on SteamEx

StreamEx.of(idsList).parallel() 
     .splitToList(100) 
     .flatCollection(ids -> dao.list(ids)) // assume dao.list(...) returns a list of records, you can switch to flatArray/flatMap per the return type of dao.list 
     .toList(); 

更新: 我做了一些性能測試的OP下的意見:(單位爲毫秒)


大小的id list:100,1000,10_000

全部一項查詢:3.5,6.9,282.2

通過批量(200)3.5,4.8,186.0

一個接一個:7.8,35.5,572.9

基於MySQL的5.7和我個人的經驗性能測試結果,我會說:

1,如果只有幾個ID,也許可以逐個查詢。

2,如果有數百/數千甚至更多,批處理或全部在一個查詢是必要的。

3,如果你想在一個語句來執行所有ID的查詢,請注意:

一)限制是1000甲骨文,8623 for SQL server

b)在限制不意味着數據庫被調整爲最大能力。

C)可能需要很長時間來執行大的查詢和數據庫可以通過長的查詢

d),超時或在數據包大小而告終。

+0

你可以使用'dao :: list'而不是'ids - > dao.list(id)'。 – shmosel

+0

用於「個人體驗」的Downvoted。如果你知道你需要獲取多行,那麼一個接一個地查詢也是不行的。至於你的情況'b)',如果你暗示它不那麼有效,你將不得不提供一些證據。 c和d一樣。有關Oracle的示例案例,請參閱[這裏](https://stackoverflow.com/questions/22797896/what-are-the-performance-implications-of-oracle-in-clause-with-no-joins)。如果您進行性能測試,您需要顯示代碼和設置,查詢計劃,否則我們不能相信您正確測試。 – Kayaman

+0

我並不是想讓你滿意,但是這個答案價值不大,並且提供了錯誤的解決方案。例如,在MySQL中最大數據包大小是可配置的,除非規劃器發生錯誤(這意味着您在配置中發生錯誤),否則執行大型查詢不會比多個小型查詢花費更長的時間。數據庫變得聰明已經有數百年的時間了,你的個人經驗並沒有成功。 – Kayaman

相關問題