import net.sf.json.JSONObject;
import net.sf.json.JSONArray;
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class MainDataAnalysis {
/**
* ç¨åºä¸»å
¥å£-è®¡ç®æ ¸å¿ç串è¡å®ç°
*
* return jsonOfAnswer JSONObject
*/
public static JSONObject runBySequentialComputing() {
try {
//计æ¶å¨å·¥å
·åå§å
ProgramTimer pt = new ProgramTimer();
pt.start();
//IPåå¸èå´å·¥å
·åå§å
IpAreaRange ipar = new IpAreaRange();
//MACå°åç»è®¡å·¥å
·åå§å
MacAddressStatistics mast = new MacAddressStatistics();
//æ¥å¿æ ¼å¼æ£å(NginXæ¥å¿,txt)
//pattern = "([^ ]*) ([^ ]*) ([^ ]*) (\\[.*\\]) (\\\".*?\\\") (-|[0-9]*) (-|[0-9]*) (\\\".*?\\\") (\\\".*?\\\") \\\"([^\\\"]*)\\\"";
//æ¥å¿æ ¼å¼æ£å(æ¯èµæ¥å¿,csv)
String pattern = "(,)?((\\\"[^\\\"]*(\\\"{2})*[^\\\"]*\\\")*[^,]*)";
Pattern r = Pattern.compile(pattern);
//读å
¥æ¥å¿æä»¶
File file = new File(FilePath.logFile);
//ç¼å²æµ
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file));
//ç¼å²åºå¤§å°ä¸º5M
BufferedReader reader = new BufferedReader(new InputStreamReader(fis, "utf-8"), 5 * 1024 * 1024);
String line = "";
//å¤ççè®°å½æ°
int dataCount = 0;
int sumDataCount = 0;
//æåçæ¡ä»¶
String needDate = "2018-07-17";
//串è¡å®ç°è®¡ç®ä»»å¡
while ((line = reader.readLine()) != null) {
//æ½åæ¥å¿æä»¶çä¸è¡è¿è¡å¤ç
sumDataCount++;
//å¹é
CSV䏿å°åä½çæ°æ®
Matcher matcher = r.matcher(line);
ArrayList listOfLineData = new ArrayList();
while(matcher.find()) {
String cell = matcher.group(2);//group(2) is ((\"[^\"]*(\"{2})*[^\"]*\")*[^,]*)
Pattern pattern2 = Pattern.compile("\"((.)*)\"");
Matcher matcher2 = pattern2.matcher(cell);
if(matcher2.find()) {
cell = matcher2.group(1);
}
//åå¹¶åä¸è¡çæ°æ®
listOfLineData.add(cell);
}
//æç
§å¹é
æ¡ä»¶æåå½åè¡éè¦çæ°æ®
if (listOfLineData.get(1).equals(needDate)){
String region;
//该记å½åå¨å¤ä¸ªIPå°å
if (listOfLineData.get(5).contains(",")){
String[] tmp = listOfLineData.get(5).split(", ");
region = ipar.search(tmp[tmp.length-1]);
}
else {
region = ipar.search(listOfLineData.get(5));
}
//该记å½ä¸åå¨MACå°å
if (listOfLineData.get(4).isEmpty()){
mast.insert("00-00-00-00-00-00");
}
else {
mast.insert(listOfLineData.get(4));
}
dataCount++;
}
}
//è¾åºå¹é
è®°å½æ°
System.out.println("Matched/Summary Data Counter: " + dataCount + "/" + sumDataCount);
//ç¨åºè¿è¡æ¶é´
System.out.println("串è¡è®¡ç®" + pt.runningTime());
//å°ç»æè½¬æ¢ä¸ºJSONä¼ åº
JSONArray arrayOfMac = JSONArray.fromObject(mast.getAnswer());
JSONArray arrayOfIp = JSONArray.fromObject(ipar.getRegionCount());
JSONObject jsonOfAnswer = new JSONObject();
jsonOfAnswer.put("mac",arrayOfMac);
jsonOfAnswer.put("prov",arrayOfIp);
jsonOfAnswer.put("Matched",dataCount);
jsonOfAnswer.put("Summary",sumDataCount);
jsonOfAnswer.put("RunningTime:",pt.runningTime());
return jsonOfAnswer;
} catch (IOException e) {
System.out.println(e);
}
return null;
}
/**
* ç¨åºä¸»å
¥å£-è®¡ç®æ ¸å¿çå¹¶è¡å®ç°-线ç¨å®å
¨
*
* return jsonOfAnswer JSONObject
*/
public static JSONObject runByParallelComputing() {
try {
//计æ¶å¨å·¥å
·åå§å
ProgramTimer pt = new ProgramTimer();
pt.start();
//IPåå¸èå´å·¥å
·åå§å
IpAreaRange ipar = new IpAreaRange();
//MACå°åç»è®¡å·¥å
·åå§å
MacAddressStatistics mast = new MacAddressStatistics();
//æ¥å¿æ ¼å¼æ£å(NginXæ¥å¿,txt)
//pattern = "([^ ]*) ([^ ]*) ([^ ]*) (\\[.*\\]) (\\\".*?\\\") (-|[0-9]*) (-|[0-9]*) (\\\".*?\\\") (\\\".*?\\\") \\\"([^\\\"]*)\\\"";
//æ¥å¿æ ¼å¼æ£å(æ¯èµæ¥å¿,csv)
String pattern = "(,)?((\\\"[^\\\"]*(\\\"{2})*[^\\\"]*\\\")*[^,]*)";
//æ£åå¹é
åå§å
Pattern r = Pattern.compile(pattern);
//读å
¥æ¥å¿æä»¶
File file = new File(FilePath.logFile);
//ç¼å²æµ
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file));
//ç¼å²åºå¤§å°ä¸º5M
BufferedReader reader = new BufferedReader(new InputStreamReader(fis, "utf-8"), 5 * 1024 * 1024);
//å¤ççè®°å½æ°(æ»è®°å½æ°)
int[] testSumDataCount = {0};
//å¤ççè®°å½æ°(æç
§æ¡ä»¶å¹é
å°çè®°å½æ°)
int[] testDataCount = {0};
//æåçæ¡ä»¶
String needDate = "2018-07-17";
//线ç¨é
Lock lock = new ReentrantLock();
//æ ¹æ®ç©çæºCPUæ ¸å¿æ°èªå¨å¤æå¯ä»¥å¼å¯ççº¿ç¨æ°é,å¹¶è¡å¤ç计ç®ä»»å¡
reader.lines().parallel().forEach((String line) -> {
//æ¯ä¸ªçº¿ç¨æ½åæ¥å¿æä»¶çä¸è¡è¿è¡å¤ç
//ååæä½ä½¿ç¨çº¿ç¨éç¡®ä¿çº¿ç¨å®å
¨
lock.lock();
try{
testSumDataCount[0] ++ ;
}
finally {
lock.unlock();
}
//å¹é
CSV䏿å°åä½çæ°æ®
Matcher matcher = r.matcher(line);
List listOfLineData = Collections.synchronizedList(new ArrayList());
while(matcher.find()) {
String cell = matcher.group(2);//group(2) is ((\"[^\"]*(\"{2})*[^\"]*\")*[^,]*)
Pattern pattern2 = Pattern.compile("\"((.)*)\"");
Matcher matcher2 = pattern2.matcher(cell);
if(matcher2.find()) {
cell = matcher2.group(1);
}
//åå¹¶åä¸è¡çæ°æ®
listOfLineData.add(cell);
}
//æç
§å¹é
æ¡ä»¶æåå½åè¡éè¦çæ°æ®
if (listOfLineData.get(1).equals(needDate)){
String region;
String infoOfIp;
String infoOfMac;
//该记å½åå¨å¤ä¸ªIPå°å
if (listOfLineData.get(5).contains(",")){
String[] tmp = listOfLineData.get(5).split(", ");
infoOfIp = tmp[tmp.length-1];
}
else {
infoOfIp = listOfLineData.get(5);
}
//该记å½ä¸åå¨MACå°å
if (listOfLineData.get(4).isEmpty()){
infoOfMac = "00-00-00-00-00-00";
}
else {
infoOfMac = listOfLineData.get(4);
}
//对åå¾çæ°æ®è¿è¡è®°å½(线ç¨å®å
¨)
lock.lock();
try{
ipar.search(infoOfIp);
mast.insert(infoOfMac);
testDataCount[0]++;
}
finally {
lock.unlock();
}
}
});
//è¾åºå¹é
è®°å½æ°
System.out.println("Matched/Summary Data Counter: " + testDataCount[0] + "/" + testSumDataCount[0]);
//ç¨åºè¿è¡æ¶é´
System.out.println("å¹¶è¡è®¡ç®" + pt.runningTime());
//å°ç»æè½¬æ¢ä¸ºJSONä¼ åº
JSONArray arrayOfMac = JSONArray.fromObject(mast.getAnswer());
JSONArray arrayOfIp = JSONArray.fromObject(ipar.getRegionCount());
JSONObject jsonOfAnswer = new JSONObject();
jsonOfAnswer.put("mac",arrayOfMac);
jsonOfAnswer.put("prov",arrayOfIp);
jsonOfAnswer.put("Matched",testDataCount[0]);
jsonOfAnswer.put("Summary",testSumDataCount[0]);
jsonOfAnswer.put("RunningTime:",pt.runningTime());
return jsonOfAnswer;
} catch (IOException e) {
System.out.println(e);
}
return null;
}
/**
* ç¨åºä¸»å
¥å£-è®¡ç®æ ¸å¿çå¹¶è¡å®ç°-é线ç¨å®å
¨
*
* return jsonOfAnswer JSONObject
*/
public static JSONObject runByParallelComputingNotSafe() {
try {
//计æ¶å¨å·¥å
·åå§å
ProgramTimer pt = new ProgramTimer();
pt.start();
//IPåå¸èå´å·¥å
·åå§å
IpAreaRange ipar = new IpAreaRange();
//MACå°åç»è®¡å·¥å
·åå§å
MacAddressStatistics mast = new MacAddressStatistics();
//æ¥å¿æ ¼å¼æ£å(NginXæ¥å¿,txt)
//pattern = "([^ ]*) ([^ ]*) ([^ ]*) (\\[.*\\]) (\\\".*?\\\") (-|[0-9]*) (-|[0-9]*) (\\\".*?\\\") (\\\".*?\\\") \\\"([^\\\"]*)\\\"";
//æ¥å¿æ ¼å¼æ£å(æ¯èµæ¥å¿,csv)
String pattern = "(,)?((\\\"[^\\\"]*(\\\"{2})*[^\\\"]*\\\")*[^,]*)";
//æ£åå¹é
åå§å
Pattern r = Pattern.compile(pattern);
//读å
¥æ¥å¿æä»¶
File file = new File(FilePath.logFile);
//ç¼å²æµ
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file));
//ç¼å²åºå¤§å°ä¸º5M
BufferedReader reader = new BufferedReader(new InputStreamReader(fis, "utf-8"), 5 * 1024 * 1024);
//å¤ççè®°å½æ°(æ»è®°å½æ°)
int[] testSumDataCount = {0};
//å¤ççè®°å½æ°(æç
§æ¡ä»¶å¹é
å°çè®°å½æ°)
int[] testDataCount = {0};
//æåçæ¡ä»¶
String needDate = "2018-07-17";
//线ç¨é
Lock lock = new ReentrantLock();
//æ ¹æ®ç©çæºCPUæ ¸å¿æ°èªå¨å¤æå¯ä»¥å¼å¯ççº¿ç¨æ°é,å¹¶è¡å¤ç计ç®ä»»å¡
reader.lines().parallel().forEach((String line) -> {
//æ¯ä¸ªçº¿ç¨æ½åæ¥å¿æä»¶çä¸è¡è¿è¡å¤ç
//ååæä½ä½¿ç¨çº¿ç¨éç¡®ä¿çº¿ç¨å®å
¨
lock.lock();
try{
testSumDataCount[0] ++ ;
}
finally {
lock.unlock();
}
//å¹é
CSV䏿å°åä½çæ°æ®
Matcher matcher = r.matcher(line);
List listOfLineData = Collections.synchronizedList(new ArrayList());
while(matcher.find()) {
String cell = matcher.group(2);//group(2) is ((\"[^\"]*(\"{2})*[^\"]*\")*[^,]*)
Pattern pattern2 = Pattern.compile("\"((.)*)\"");
Matcher matcher2 = pattern2.matcher(cell);
if(matcher2.find()) {
cell = matcher2.group(1);
}
//åå¹¶åä¸è¡çæ°æ®
listOfLineData.add(cell);
}
//æç
§å¹é
æ¡ä»¶æåå½åè¡éè¦çæ°æ®
if (listOfLineData.get(1).equals(needDate)){
String region;
String infoOfIp;
String infoOfMac;
//该记å½åå¨å¤ä¸ªIPå°å
if (listOfLineData.get(5).contains(",")){
String[] tmp = listOfLineData.get(5).split(", ");
infoOfIp = tmp[tmp.length-1];
}
else {
infoOfIp = listOfLineData.get(5);
}
//该记å½ä¸åå¨MACå°å
if (listOfLineData.get(4).isEmpty()){
infoOfMac = "00-00-00-00-00-00";
}
else {
infoOfMac = listOfLineData.get(4);
}
ipar.search(infoOfIp);
mast.insert(infoOfMac);
lock.lock();
try{
testDataCount[0]++;
}
finally {
lock.unlock();
}
}
});
//è¾åºå¹é
è®°å½æ°
System.out.println("Matched/Summary Data Counter: " + testDataCount[0] + "/" + testSumDataCount[0]);
//ç¨åºè¿è¡æ¶é´
System.out.println("éå®å
¨å¹¶è¡è®¡ç®" + pt.runningTime());
//å°ç»æè½¬æ¢ä¸ºJSONä¼ åº
JSONArray arrayOfMac = JSONArray.fromObject(mast.getAnswer());
JSONArray arrayOfIp = JSONArray.fromObject(ipar.getRegionCount());
JSONObject jsonOfAnswer = new JSONObject();
jsonOfAnswer.put("mac",arrayOfMac);
jsonOfAnswer.put("prov",arrayOfIp);
jsonOfAnswer.put("Matched",testDataCount[0]);
jsonOfAnswer.put("Summary",testSumDataCount[0]);
jsonOfAnswer.put("RunningTime:",pt.runningTime());
return jsonOfAnswer;
} catch (IOException e) {
System.out.println(e);
}
return null;
}
/**
* è·åç³»ç»æ§è½ä¿¡æ¯çå
¥å£å½æ°(注æ!ä»
æ¯æWindowsç³»ç»åLinuxç³»ç»,䏿¯æMacOS)
*
* @return jsonOfAnswer JSONObject
*/
public static JSONObject getSystemInfo() throws Exception {
//å½åç³»ç»çCPU使ç¨ç
double cpuUsage = SystemInfo.getCpuUsage();
//å½åç³»ç»çå
å使ç¨ç
double memUsage = SystemInfo.getMemUsage();
//å½åç³»ç»ç硬ç使ç¨ç
double diskUsage = SystemInfo.getDiskUsage();
JSONObject jsonOfAnswer = new JSONObject();
jsonOfAnswer.put("CPU",Integer.toString(
Integer.parseInt(new java.text.DecimalFormat("0").format(cpuUsage))));
return jsonOfAnswer;
}
public static void main(String[] args){
//System.out.println(MainDataAnalysis.runBySequentialComputing());
//System.out.println(MainDataAnalysis.runByParallelComputing());
System.out.println(MainDataAnalysis.runByParallelComputingNotSafe());
}
}