我正在研究一個java程序,它實際上從postgresql數據庫中檢索元組,並與他們一起工作。我將每個元組表示爲String
的Vector
以及作爲元組向量的tuple(resultSet)的完整集合。如何高效地處理java中數百萬元組的集合?
Vector<String> tuple;
Vector<Vector<String>> resultSet;
在我的應用程序中,我需要處理幾百萬個元組。這裏是一個簡單的基準,它通過簡單地讀取resultSet中的X元組來模擬我的程序,然後打印結果集大小,第一個和最後一個元組。
基準考慮使用Vector和ArrayList代表元組
List<String> tuple;
List<List<String>> resultSet;
基準程序代碼
import java.util.Vector;
import java.util.List;
import java.util.ArrayList;
public class VectorVSarrayList {
public static void loadDataInVector(Integer size){
Vector<Vector<String>> r = new Vector<Vector<String>>();
Vector<String> tuple = new Vector<String>();
startTimer();
for(Integer i = 0; i < size; i++){
tuple = new Vector<String>();
for(int j = 0; j < 3; j ++)
tuple.add(i.toString() + " tuple "+j);
r.add(tuple);
}
endTimer("vector size " + r.size() + " first element : " + r.get(0).get(0) + ", and last element : " + r.get(r.size()-1).get(0));
r.clear();
}
public static void loadDataInArrayList(Integer size){
List<List<String>> r = new ArrayList<List<String>>();
List<String> tuple = new ArrayList<String>();
startTimer();
for(Integer i = 0; i < size; i++){
tuple = new ArrayList<String>();
for(int j = 0; j < 3; j ++)
tuple.add(i.toString() + " tuple "+j);
r.add(tuple);
}
endTimer("array size " + r.size() + " first element : " + r.get(0).get(0) + ", and last element : " + r.get(r.size()-1).get(0));
r.clear();
}
public static void main(String [] args){
Integer size = Integer.parseInt(args[0]);
loadDataInArrayList(size);
loadDataInVector(size);
loadDataInArrayList(size);
loadDataInVector(size);
}
private static long startTime = 0;
private static long endTime = 0;
public static void startTimer(){
startTime = System.currentTimeMillis();
}
public static void endTimer(String log){
endTime = System.currentTimeMillis();
System.out.println(log + ", " + (endTime - startTime) + ", ms");
}
}
我已經運行的基準,以處理1個10百萬元組與Java堆大小擴展到2G,這裏是結果
> time java -Xmx2g VectorVSarrayList 1000000
array size 1000000 first element : 0 tuple 0, and last element : 999999 tuple 0, 1642, ms
vector size 1000000 first element : 0 tuple 0, and last element : 999999 tuple 0, 1075, ms
array size 1000000 first element : 0 tuple 0, and last element : 999999 tuple 0, 1625, ms
vector size 1000000 first element : 0 tuple 0, and last element : 999999 tuple 0, 308, ms
real 0m4.829s
user 0m14.849s
sys 0m0.500s
> time java -Xmx2g VectorVSarrayList 10000000
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at VectorVSarrayList.loadDataInArrayList(VectorVSarrayList.java:72)
at VectorVSarrayList.main(VectorVSarrayList.java:28)
real 6m12.708s
user 22m57.662s
sys 0m6.200s
這些結果顯示:噸甚至只有10百萬元組,我會花至少6分鐘(僅爲4秒1百萬美元),最終通過內存溢出
OS : Ubuntu 12.04
RAM : 6 GB
processor : Intel(R) Core(TM) i7-2640M CPU @ 2.80GHz
運行有什麼好辦法(更好地收集型或更好的初步實踐)來做到這一點什麼樣的工作 ?
要開始,不要使用'Vector';自從Java 1.2以來,它基本上被棄用了。除非使用需要'Vector'的古老API,否則總是比較喜歡'List'。 – chrylis
更一般地說,答案是*不要做*。抓取ResultSet對象並直接遍歷它,而不是嘗試將整個數據庫塞進RAM中。 – chrylis