我在mongoDB中有4000萬個數據。我正在從收集中並行讀取這些數據,並將其處理並轉儲到另一個收集中。Java多線程性能隨線程池大小的增加而變差
作業初始化的示例代碼。
ExecutorService executor = Executors.newFixedThreadPool(10);
int count = total_number_of_records in reading collection
int pageSize = 5000;
int counter = (int) ((count%pageSize==0)?(count/pageSize):(count/pageSize+1));
for (int i = 1; i <= counter; i++) {
Runnable worker = new FinalParallelDataProcessingStrategyOperator(mongoDatabase,vendor,version,importDate,vendorId,i,securitiesId);
executor.execute(worker);
}
每個線程做
public void run() {
try {
List<SecurityTemp> temps = loadDataInBatch();
populateToNewCollection(temps);
populateToAnotherCollection(temps);
} catch (IOException e) {
e.printStackTrace();
}
}
加載數據是通過使用下面的查詢
mongoDB.getCollection("reading_collection").find(whereClause).
.skip(pagesize*(n-1)).limit(pagesize).batchSize(1000).iterator();
機配置分頁以下的事情: CPU分別用1個核2
並行實現的性能與順序相當。 統計數據的子集(319568個記錄)
No. of Threads Execution Time(minutes)
1 16
3 15
8 17
10 17
15 16
20 12
50 30
如何改善這個應用程序的性能?
提高線程的數目不會自動提高性能和線程太多可能會導致開銷的問題。很難說,爲什麼你有1個相同的性能 - 10個線程,也許你的瓶頸是分貝?是一個本地數據庫? – JohnnyAW
也可JVM配置,如果在只有一個核心接入那麼你不會看到任何太大起色一個孤立的環境中運行。 – Gimby
是的,它是本地數據庫 – omkar1707