ログを含む 2 つのファイル (それぞれ約 5000 行) があります。各行のファイルには、次のように電子メールにも関連付けられた一連のルールがあります。
Y#12#EMAIL_1#RULE_1,RULE_2,RULE_3,RULE_4#time=993470174
Y#12#EMAIL_2#RULE_1,RULE_2,RULE_3,RULE_4#time=993470175
Y#12#EMAIL_3#RULE_1,RULE_2,RULE_3#time=9934701778
次の関数を使用してファイルを読み取り、各メールのルールを取得します。
private void processFile()
{
ArrayList<String[]> lSplitRules = new ArrayList<>();
try {
FileInputStream fileStream = new FileInputStream("log.log");
DataInputStream fileIn = new DataInputStream(fileStream);
BufferedReader fileBr = new BufferedReader(new InputStreamReader(fileIn));
String strLine;
while ((strLine = fileBr.readLine()) != null)
{
String[] lTokens = strLineSpam.split("#");
String lRawRules = lTokens[3];
lSplitRules.add(lRawRules.split(","));
}
} catch (FileNotFoundException e) {
System.out.println("File: log.log, not found. Error: " + e.getMessage());
} catch (IOException e) {
System.out.println("Couldn't open log.log. Error: " + e.getMessage());
}
ここまでは順調ですね。ArrayList の各「スペース」には、各電子メールのルールを含む String[] があります。一方、ルールの一意のリストを 1 つ含む HashMap もあり、その値は次のようになります。
RULE_NAME - VALUE
RULE_1 - 0.1
RULE_2 - 0.5
RULE_3 - 0.6
...
すべてのメールのすべてのルールを比較して、HashMap に存在するかどうかを確認する必要があります。存在する場合、いくつかの計算のルールの値が返されます。そのためにこの関数を使用します。
private Double eval (String rule, Map<String, Double> scores)
{
for (Entry<String, Double> entry : scores.entrySet()) {
if (entry.getKey().equalsIgnoreCase(rule))
{
return entry.getValue();
}
}
return 0.0;
}
問題は、遺伝的アルゴリズムを使用して各ルールの値を最適化しようとしているため、すべてのメールとそのルールを複数回 (10,000 回以上) 比較する必要があることです。HASHMAP を介して各メールのルールの比較を最適化する方法はありますか? 速度が必要なので、現在 8 分間で 100 件の検証を行っています。
私の英語でごめんなさい。
よろしく