【发布时间】:2017-01-22 16:14:36
【问题描述】:
我有 200,000 个文件,我必须为其处理和提取每个文件的令牌。所有文件的大小为 1.5GB。当我编写用于从每个文件中提取令牌的代码时,它运行良好。总执行时间为 10 分钟。
在那之后,我尝试删除stopwords 性能严重下降。需要 25 到 30 分钟。
我正在使用来自here 网站的停用词,大约有 571 个停用词。一般过程是一次从文本文件中提取每个停用词,并与文件中的每个标记进行比较。
这是代码的存根
StringBuilder sb = new StringBuilder();
for(String s : tokens)
Scanner sc=new Scanner(new File("stopwords.txt"));
while(sc.hasNext())
{
if(sc.next().equals(s)){
flag = true;
break;
}
}
if(flag)
sb.append(s + "\n" );
flag = false;
}
String str = sb.toString()
**忽略错误。
以上代码的性能至少比以下代码低 10 倍。执行需要 50 到 60 分钟。
StringBuilder sb = new StringBuilder();
String s = tokens.toString();
String str = s.replaceAll("StopWord1|Stopword2|Stopword3|........|LastStopWord"," ");
性能非常好。这需要 20 到 25 分钟。
有没有更好的方法?
【问题讨论】:
-
将停用词放在
HashSet<String>中,并使用set.contains(word)来确定某个词是否为停用词。这应该是有效的。 -
你使用多线程吗?如果你不这样做,它会有很大帮助。
-
是的..我正在使用 6 个线程..
-
6 个线程?你让这变得复杂了。你是cpu绑定和磁盘。线程对你帮助不大。
-
是的..我想弄清楚..我的电脑配置很好..
标签: java algorithm stop-words