是否有任何有效的方法來並行化Java中的大量GET請求?我有一個包含200,000行的文件,每個文件都需要維基媒體的GET請求。然後我必須將一部分響應寫入一個通用文件。我粘貼了我的代碼的主要部分作爲參考。並行化許多GET請求
while ((line = br.readLine()) != null) {
count++;
if ((count % 1000) == 0) {
System.out.println(count + " tags parsed");
fbw.flush();
bw.flush();
}
//System.out.println(line);
String target = new String(line);
if (target.startsWith("\"") && (target.endsWith("\""))) {
target = target.replaceAll("\"", "");
}
String url = "http://en.wikipedia.org/w/api.php?action=query&prop=revisions&format=xml&rvprop=timestamp&rvlimit=1&rvdir=newer&titles=";
url = url + URLEncoder.encode(target, "UTF-8");
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
// optional default is GET
con.setRequestMethod("GET");
//add request header
//con.setRequestProperty("User-Agent", USER_AGENT);
int responsecode = con.getResponseCode();
//System.out.println("Sending 'Get' request to URL: " + url);
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
Document doc = loadXMLFromString(response.toString());
NodeList x = doc.getElementsByTagName("revisions");
if (x.getLength() == 1) {
String time = x.item(0).getFirstChild().getAttributes().item(0).getTextContent().substring(0,10).replaceAll("-", "");
bw.write(line + "\t" + time + "\n");
} else if (x.getLength() == 2) {
String time = x.item(1).getFirstChild().getAttributes().item(0).getTextContent().substring(0, 10).replaceAll("-", "");
bw.write(line + "\t" + time + "\n");
} else {
fbw.write(line + "\t" + "NULL" + "\n");
}
}
我用google搜索了一下,似乎有兩種選擇。一個是創建線程,另一個是使用稱爲Executor的東西。有人可以提供一點指導,說明哪一個更適合這項任務?
使用'Executor'這是使用線程更簡單的方法。另外考慮使用專用庫來通過重新使用連接來最大限度地減少TCP開銷。 –
有效的問題,但有了這麼多的請求,你可能會考慮只是[下載維基百科數據庫](http://en.wikipedia.org/wiki/Wikipedia:Database_download),而不是一塊一塊地請求它?他們不一定[像網絡爬蟲](http://en.wikipedia.org/wiki/Wikipedia:Database_download#Why_not_just_retrieve_data_from_wikipedia.org_at_runtime.3F)。 –