Hallo zusammen,
bisher habe ich hier echt tolle Ratschläge bekommen. Heute habe ich nur ein Anliegen bezüglich der Verbesserung meiner Rechenzeit.
Ich habe eine große Menge an Daten, welche in 30 sek Intervallen mit Zeitstempeln versehen sind:
Wobei MP=MorningPeak, EP=EveningPeak, WD=Weekday, WE=Weekend.
Nun habe ich also die Enum-Klasse EnumDayProperties:
Auf der anderen Seite habe ich nun meine Ranking der SegmentIDs:
Die Klasse DsegProperties hält lediglich die Attribute fest und inkrementiert diese via updateDsegProperties. Dafür nutze ich leider zweimal dieselbe Klasse. Einmal für den vormittags und einmal für abends. Für die Berechnung des gesamten Datensatzes über ein Jahr (ca 60 Mio Datensätze) habe ich nun 11 Std. benötigt. Kann ich die Enum-Klasse irgendwie effizienter verwenden, sodass die Rechenleistung gesteigert wird?
Ich hoffe, dass das soweit verständlich dargeboten ist. Vielen Dank schon mal
Paul
bisher habe ich hier echt tolle Ratschläge bekommen. Heute habe ich nur ein Anliegen bezüglich der Verbesserung meiner Rechenzeit.
Ich habe eine große Menge an Daten, welche in 30 sek Intervallen mit Zeitstempeln versehen sind:
Timestamp , Attribut1, Attribut2, SegmentIDs
2015-12-06T06:17:00Z, 5, 10 , 1001|1002|1003|
, 15, 25 , 2004|2005|2006|
2015-12-06T06:17:30Z, 10, 15 , 1001|1002|1003|1004|
, 20, 30 , 2004|2005|
Während ich meine Daten auslese, speichere ich die SegmentIDs je nach ihrem Zeitstempel mit ihren Attributen in einer Map. Da ich an das Auftreten der SegmentIDs an verschiedenen Tagen und Tageszeiten interessiert bin, nutze ich eine Enum-Klasse, um festzustellen, ob die SegmentID entweder am Wochenende, wochentags, morgens oder abends gemeldet wurde. Es ergeben sich demnach 4 (hash)Maps: MP-WD, EP-WD, MP-WE, EP-WE2015-12-06T06:17:00Z, 5, 10 , 1001|1002|1003|
, 15, 25 , 2004|2005|2006|
2015-12-06T06:17:30Z, 10, 15 , 1001|1002|1003|1004|
, 20, 30 , 2004|2005|
Wobei MP=MorningPeak, EP=EveningPeak, WD=Weekday, WE=Weekend.
Nun habe ich also die Enum-Klasse EnumDayProperties:
Java:
public class EnumDayProperties {
public static String getWeekday (Instant day){
String dayProperty = null;
LocalDateTime ldt = LocalDateTime.ofInstant(day, ZoneId.of("Zulu"));
LocalDate ld = LocalDate.parse(ldt.toLocalDate().toString());
int ordinalNumberDay = getOrdinalFromWeekday(ld.getDayOfWeek().toString());
if(ordinalNumberDay == 5 || ordinalNumberDay == 6)
dayProperty = "WE";
else
dayProperty = "WD";
return dayProperty;
}
public enum Weekday{
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public enum Peak{
MP, EP, NP
}
public static String getOrdinalFromTime (LocalTime time){
String peak = null;
if(time.isAfter(LocalTime.parse("06:00:00")) && time.isBefore(LocalTime.parse("12:00:00")))
peak = "MP";
else if(time.isAfter(LocalTime.parse("12:00:00")) && time.isBefore(LocalTime.parse("18:00:00")))
peak = "EP";
peak = "NP";
return peak;
}
public static boolean TimeSliceIsMorning (String string){
LocalTime morningEnd = LocalTime.parse("12:00:00");
LocalTime morningStart = LocalTime.parse("06:00:00");
LocalTime time = LocalTime.parse(string);
return time.isBefore(morningEnd) && time.isAfter(morningStart);
}
private static int getOrdinalFromWeekday( String name )
{
try {
return Weekday.valueOf( name ).ordinal();
}
catch ( IllegalArgumentException e ) {
return 9999;
}
}
}
Auf der anderen Seite habe ich nun meine Ranking der SegmentIDs:
Java:
public class DsegRanking {
public static void main(String[] args) throws Exception{
Map<Long, DsegProperties> mpWD = new HashMap<>();
Map<Long, EveningDsegProperties> epWD = new HashMap<>();
Map<Long, DsegProperties> mpWE = new HashMap<>();
Map<Long, EveningDsegProperties> epWE = new HashMap<>();
List<File> fileList = new ArrayList<File>();
//getting the list of all files that need to be parsed
fileList = getAllFiles();
String line = "";
BufferedReader dataLine = null;
Instant timestamp = null;
for (int j = 0; j < fileList.size(); j++) {
try {
FileInputStream fin = new FileInputStream(fileList.get(j));
GzipCompressorInputStream gzIn = new GzipCompressorInputStream(fin);
Reader rd = new InputStreamReader(gzIn, "US-ASCII");
dataLine = new BufferedReader(rd);
while ((line = dataLine.readLine()) != null) {
String[] content = line.split(",");
if (StringUtils.isEmpty(content[COLUMN_TIMESTAMP]) == false ) {
timestamp =(content[COLUMN_TIMESTAMP]);
chooseMap(mpWD,epWD,mpWE,epWE,content,timestamp);
}
else if (content[COLUMN_TIMESTAMP].isEmpty()) {
chooseMap(mpWD,epWD,mpWE,epWE,content,timestamp);
}
}
}
catch (IOException ex) {
ex.printStackTrace();
}
}
writeJamsMorningWeekdays(mpWD);
writeJamsEveningWeekdays(epWD);
writeJamsMorningWeekend(mpWE);
writeJamsEveningWeekend(epWE);
}
private static void chooseMap(Map<Long, DsegProperties> mpWD, Map<Long, EveningDsegProperties> epWD,
Map<Long, DsegProperties> mpWE, Map<Long, EveningDsegProperties> epWE, String[] content, Instant timestamp) {
String day = Implements.EnumDayProperties.getWeekday(timestamp);
String time = Implements.EnumDayProperties.getPeak(timestamp);
if (day.contains("WD") && time.contains("MP"))
calculateDsegProperties(content,mpWD,timestamp);
else if (day.contains("WD") && time.contains("EP"))
calculateEveningDsegProperties(content,epWD,timestamp);
else if (day.contains("WE") && time.contains("MP"))
calculateDsegProperties(content,mpWE,timestamp);
else if (day.contains("WE") && time.contains("EP"))
calculateEveningDsegProperties(content,epWE,timestamp);
}
private static void calculateDsegProperties(String[] content, Map<Long, DsegProperties> mapping, Instant timestamp) {
List<Long> dsegColumnList = new ArrayList<>(600000);
String dsegColumn = content[COLUMN_DSEGID];
getDsegs(dsegColumn, dsegColumnList);
for (Long segmentID : dsegColumnList){
DsegProperties dsegProperties = mapping.get(segmentID);
if (dsegProperties == null){
dsegProperties = new DsegProperties(content,segmentID,timestamp);
mapping.put(segmentID, dsegProperties);
}
else if(dsegProperties != null){
dsegProperties.updateDsegID(content, segmentID,timestamp);
mapping.put(segmentID, dsegProperties);
}
}
}
private static void calculateEveningDsegProperties(String[] content, Map<Long, EveningDsegProperties> mapping, Instant timestamp) {
List<Long> dsegColumnList = new ArrayList<>(600000);
String dsegColumn = content[COLUMN_DSEGID];
getDsegs(dsegColumn, dsegColumnList);
for (Long segmentID : dsegColumnList){
EveningDsegProperties dsegProperties = mapping.get(segmentID);
if (dsegProperties == null){
dsegProperties = new EveningDsegProperties(content,segmentID,timestamp);
mapping.put(segmentID, dsegProperties);
}
else if(dsegProperties != null){
dsegProperties.updateEveningDsegID(content, segmentID,timestamp);
mapping.put(segmentID, dsegProperties);
}
}
}
}
Die Klasse DsegProperties hält lediglich die Attribute fest und inkrementiert diese via updateDsegProperties. Dafür nutze ich leider zweimal dieselbe Klasse. Einmal für den vormittags und einmal für abends. Für die Berechnung des gesamten Datensatzes über ein Jahr (ca 60 Mio Datensätze) habe ich nun 11 Std. benötigt. Kann ich die Enum-Klasse irgendwie effizienter verwenden, sodass die Rechenleistung gesteigert wird?
Ich hoffe, dass das soweit verständlich dargeboten ist. Vielen Dank schon mal
Paul