我的任务是读取大型CSV文件(300k +记录)并将regexp模式应用于每条记录.我一直是一名PHP开发人员,从未真正尝试过任何其他语言,但决定我应该尝试使用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);
?>
Run Code Online (Sandbox Code Playgroud)
JAVA CODE
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.");
}
}
Run Code Online (Sandbox Code Playgroud)
我没有发现您的代码有任何明显的错误。尝试使用分析器隔离性能瓶颈。我发现netbeans分析器非常用户友好。
编辑:为什么要推测?分析应用程序并获取有关时间花费情况的详细报告。然后努力解决低效领域。有关详细信息,请参阅http://profiler.netbeans.org/ 。
EDIT2:好的,我感到无聊并对此进行了分析。我的代码与你的相同,并解析了包含 1,000 行相同行的 CSV 文件,如下所示:
SOME REGEXP,SOME REGEXP,SOME REGEXP,SOME REGEXP,SOME REGEXP,SOME REGEXP,SOME REGEXP,SOME REGEXP,SOME REGEXP,SOME REGEXP
Run Code Online (Sandbox Code Playgroud)
这是结果(显然你的结果会有所不同,因为我的正则表达式很简单)。然而,很明显,正则表达式处理不是您关注的主要领域。
有趣的是,如果我应用 BufferedReader,性能将提升高达 18%(见下文)。