Мне было поручено читать большие файлы CSV (более 300 тыс. Записей) и применять шаблоны регулярных выражений к каждой записи. Я всегда был разработчиком PHP и никогда особо не пробовал какие-либо другие языки, но решил, что мне следует нырнуть и попытаться сделать это с помощью Java, который, как я предполагал, будет намного быстрее.
Фактически, просто прочитав строку файла CSV, line была в 3 раза быстрее на Java. Однако, когда я применил требования к регулярному выражению, реализация Java оказалась на 10-20% дольше, чем сценарий PHP.
Вполне возможно, что я сделал что-то не так на Java, потому что я узнал об этом только сегодня, когда учился. Ниже приведены два сценария, мы будем благодарны за любые советы. Я действительно хотел бы не отказываться от Java для этого конкретного проекта.
PHP CODE
<?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 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.");
}
}