【发布时间】:2011-07-11 20:55:14
【问题描述】:
我的任务是读取大型 CSV 文件(超过 30 万条记录)并将正则表达式模式应用于每条记录。我一直是一名 PHP 开发人员,从未真正尝试过任何其他语言,但我决定尝试使用 Java 来完成这项工作,我认为这会更快。
事实上,在 Java 中逐行读取 CSV 文件的速度要快 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.");
}
}
【问题讨论】:
-
与您的正则表达式问题不完全相关,但您可能想查看download.oracle.com/javase/6/docs/api/java/util/Scanner.html。您可能会发现不需要您的 CSVReader 类。不创建所有这些临时字符串(
nextLine似乎至少有 7 个字符串,但您只需要一个)可能会提高性能。