Hallo follgendes Problem
ich habe eine DatenListe.
Auszug:
...
212789184 212789191 PRI
212792264 212792271 USA
212792272 212792279 PRI
212792280 212792287 USA
212792288 212792319 PRI
212792320 212793199 USA
212793200 212793207 VIR
212793208 212793215 PRI
212793216 212794783 USA
212794784 212794791 VIR
212794792 212794799 USA
212794800 212794815 VIR
212794816 212794879 USA
...
Insgesamt sind es ca 103000 zeilen(!).
Wie man sieht es sind die s.g. IP Blocks. Die Liste ist aufsteigend sortiert.
Ich bekomme eine IP Adresse und rechen IP Code aus. zB aus IP "a.b.c.d" bekomme ich IP code 212794820. Jetzt laufe ich die Liste durch und pruefe Zeile für Zeile
ob mein IP Code zwischen den ersten und zweiten Zahl liegt, wenn ja, dann bekomme ich als Ergebnis der LänderCode.
In diesem Beispiel liegt 212794820 zwischen 212794816 und 212794879 . Ergebnis also USA (letzte Zeile aus dem Auszug. siehe oben)
Problem:
Wie gesagt, es sind über 103000 Zeilen und die Liste ist in einer Datei file.log gespeichert. Zugriff also über FileReader/BufferedReader. Um eine Ip Adresse zu bearbeiten brauche ich bis zu 900 ms, besonders lange dauert das wenn die Liste fast bis zum Ende bearbeitet werden muss.
Frage also, wie kann ich das am schnellsten erledigen? Das ist wichtig da ich eine UserListe in einer JTable habe und diese wird mit allen UserInformationen alle 1 bis 2 sekunden aktualisiert. d.h. bei
20 User wird das zu lange dauern bis alle IPs bestimmt sind.
Ich dachte ich mache mal ein String[][][] feld und dann mit Bisektionssuche nach passendem Block suchen... aber bevor ich das mache frage lieber nach
P.S.
So rechne ich IP Code aus.
Danke schon mal.
ich habe eine DatenListe.
Auszug:
...
212789184 212789191 PRI
212792264 212792271 USA
212792272 212792279 PRI
212792280 212792287 USA
212792288 212792319 PRI
212792320 212793199 USA
212793200 212793207 VIR
212793208 212793215 PRI
212793216 212794783 USA
212794784 212794791 VIR
212794792 212794799 USA
212794800 212794815 VIR
212794816 212794879 USA
...
Insgesamt sind es ca 103000 zeilen(!).
Wie man sieht es sind die s.g. IP Blocks. Die Liste ist aufsteigend sortiert.
Ich bekomme eine IP Adresse und rechen IP Code aus. zB aus IP "a.b.c.d" bekomme ich IP code 212794820. Jetzt laufe ich die Liste durch und pruefe Zeile für Zeile
ob mein IP Code zwischen den ersten und zweiten Zahl liegt, wenn ja, dann bekomme ich als Ergebnis der LänderCode.
In diesem Beispiel liegt 212794820 zwischen 212794816 und 212794879 . Ergebnis also USA (letzte Zeile aus dem Auszug. siehe oben)
Problem:
Wie gesagt, es sind über 103000 Zeilen und die Liste ist in einer Datei file.log gespeichert. Zugriff also über FileReader/BufferedReader. Um eine Ip Adresse zu bearbeiten brauche ich bis zu 900 ms, besonders lange dauert das wenn die Liste fast bis zum Ende bearbeitet werden muss.
Frage also, wie kann ich das am schnellsten erledigen? Das ist wichtig da ich eine UserListe in einer JTable habe und diese wird mit allen UserInformationen alle 1 bis 2 sekunden aktualisiert. d.h. bei
20 User wird das zu lange dauern bis alle IPs bestimmt sind.
Ich dachte ich mache mal ein String[][][] feld und dann mit Bisektionssuche nach passendem Block suchen... aber bevor ich das mache frage lieber nach
Java:
public String getCountryByIp(String ip) {
long c = getIPCode(ip);
FileReader fileReader = null;
String a = "";
String[] b;
long x;
long y;
try {
fileReader = new FileReader("src/file/ipcodes.log"); // 500 - 1000 ms
BufferedReader reader = new BufferedReader(fileReader);
a = reader.readLine();
while (a != null) {
b = a.split(" ");
x = Long.parseLong(b[0]);
y = Long.parseLong(b[1]);
if (c >= x && c <= y) {
return b[2];
}
a = reader.readLine();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "Not found...";
}
P.S.
So rechne ich IP Code aus.
Code:
202.186.13.14
A = 202
B = 186
C = 13
D = 14
16777216*A + 65536*B + 256*C + D
also
16777216*202 + 65536*186 + 256*13 + 14 = 3401190670
Danke schon mal.
Zuletzt bearbeitet: