我正在尝试从需要从大量文件中提取文本的C#项目中使用Tika。
我从一个简单的概念证明开始,该概念使用了TikaJAXRS,读取文件的内容,并将文件内容的HTTP PUT请求发送到http://localhost:9998/tika
的TikaJAXRS服务器。这种方法运行得相当不错,但令我印象深刻的是,通过HTTP传输内容的开销必然会降低速度。
因此,我决定编写一个Java实现,以了解从等式中删除HTTP后性能的比较。我发现的是出乎意料的。它执行多更慢,大约需要两倍的时间来解析65个不同类型的文件,共计16MB。 TikaJAXRS HTTP场景为1200毫秒,Java应用程序为2400毫秒。
我使用的TikaJAXRS服务器和Tika库都是1.7版本。我的Java代码清单如下。我错过了什么,为什么我的Java应用程序这么慢?
import org.apache.log4j.varia.NullAppender;
import org.apache.tika.Tika;
import org.apache.tika.exception.TikaException;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.apache.commons.lang3.time.StopWatch;
public class TikaTest {
public static void main(String[] args) {
// I'm not interested in what log4j has to say...
org.apache.log4j.BasicConfigurator.configure(new NullAppender());
File folder = new File("C:\\LMDevelopment");
StopWatch timer = new StopWatch();
timer.start();
Collection<File> files = FileUtils.listFiles(folder, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
Tika tikaClient = new Tika();
try {
tikaClient.parseToString(files.iterator().next());
} catch (IOException e) {
e.printStackTrace();
} catch (TikaException e) {
e.printStackTrace();
}
System.out.println("Time to warm up: " + timer.getTime() + "ms");
timer.reset();
timer.start();
for (File f : files)
{
try {
tikaClient.parseToString(f);
} catch (IOException e) {
e.printStackTrace();
} catch (TikaException e) {
e.printStackTrace();
}
}
timer.stop();
System.out.println("Time to parse all files: " + timer.getTime() + "ms");
}
}