我已经找了很长一段时间的解决方案,但我仍然在努力进行并发和并行化。
背景:有一个ETL过程,我得到一个大的csv(高达一百多万行)。在制作中也会有实时更新。我想拼写检查每一行。为此,我使用了一个改编的LanguageTool。检查方法(我的内部定制)需要相当长的时间。我想加快速度。
一方面当然是方法本身,但我也想一次只检查多行。行的顺序并不重要。结果是更正后的文本,应将其写入新的csv文件以供进一步处理。
我发现ExecutorService
可能是一个合理的选择,但由于我不熟悉它,所以会有一些帮助。
到目前为止,这是我在ETL过程中使用它的方式:
private static SpellChecker spellChecker;
static {
SpellChecker tmp = null;
try {
tmp = new SpellChecker(...);
} catch (Exception e) {
e.printStackTrace();
}
spellChecker = tmp;
}
public static String spellCheck(String input) {
String output = input.replace("</li>", ".");
output = searchAVC.removeHtml(output);
try {
output = spellChecker.correctText(output);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return output;
}
我的spellChecker是一个自定义库,我创建了它的静态对象(因为LanguageTool的实例需要一些时间)。
我想简化spellCheck
的执行。
我已经读过这样的东西了: https://www.airpair.com/java/posts/parallel-processing-of-io-based-data-with-java-streams What is the easiest way to parallelize a task in java? Write to text file from multiple threads?
我真的不知道要结合所有这些信息。阅读文件时我需要注意什么?写文件?处理行?
答案 0 :(得分:0)
创建负责的Reader类正在从File中读取。 Create Writer类负责从文件写入。 创建处理器类负责处理。 现在创建一个负责读取块的分区器并将批量行发送给读者,读者将使用处理器处理并向批处理器发送批量行。 运行创建一个线程池以在多线程环境中执行。