我的任務是讀取大型CSV文件(300k +記錄)並將正則表達式模式應用於每條記錄。我一直是一名PHP開發人員,從來沒有真正嘗試過任何其他語言,但決定我應該深入研究,並嘗試使用Java來實現這一點,我認爲這會更快。比預期的Java正則表達式更慢
實際上,只是逐行讀取CSV文件的速度是Java的3倍。但是,當我應用正則表達式要求時,Java實現證明比PHP腳本長10-20%。
我在Java中做了錯誤的事情的可能性很大,因爲我剛剛在今天去了解了這一點。以下是兩個腳本,任何建議將不勝感激。我真的不想放棄Java這個特定的項目。
PHP代碼
<?php
$bgtime=time();
$patterns =array(
"/SOME REGEXP/",
"/SOME REGEXP/",
"/SOME REGEXP/",
"/SOME REGEXP/"
);
$fh = fopen('largeCSV.txt','r');
while($currentLineString = fgetcsv($fh, 10000, ","))
{
foreach($patterns AS $pattern)
{
preg_match_all($pattern, $currentLineString[6], $matches);
}
}
fclose($fh);
print "Execution Time: ".(time()-$bgtime);
?>
Java代碼
import au.com.bytecode.opencsv.CSVReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.ArrayList;
public class testParser
{
public static void main(String[] args)
{
long start = System.currentTimeMillis();
String[] rawPatterns = {
"SOME REGEXP",
"SOME REGEXP",
"SOME REGEXP",
"SOME REGEXP"
};
ArrayList<Pattern> compiledPatternList = new ArrayList<Pattern>();
for(String patternString : rawPatterns)
{
Pattern compiledPattern = Pattern.compile(patternString);
compiledPatternList.add(compiledPattern);
}
try{
String fileName="largeCSV.txt";
CSVReader reader = new CSVReader(new FileReader(fileName));
String[] header = reader.readNext();
String[] nextLine;
String description;
while((nextLine = reader.readNext()) != null)
{
description = nextLine[6];
for(Pattern compiledPattern : compiledPatternList)
{
Matcher m = compiledPattern.matcher(description);
while(m.find())
{
//System.out.println(m.group(0));
}
}
}
}
catch(IOException ioe)
{
System.out.println("Blah!");
}
long end = System.currentTimeMillis();
System.out.println("Execution time was "+((end-start)/1000)+" seconds.");
}
}
與您的正則表達式問題不完全相關,但您可能需要查看http://download.oracle.com/javase/6/docs/api/java/util/Scanner.html。你可能會發現你的CSVReader類是不需要的。不創建所有這些臨時字符串('nextLine'似乎至少有7個字符串,但只需要一個)可能會提高性能。 – wolfcastle