多线程问题求助
在项目中,有两个数据集A和B,每个数据集中都有上万个英文文本(比如说各有10000个),现在要计算数据集A中任意一个文本和数据集B中任意一个文本的相似度。由于计算量很大,一共要计算10000*10000对文本间的相似度,所以我打算用多线程来实现以加快处理的速度。我是这样做的:
class similarity implements Runnable {
String source="";
String target="";
...
public similarity(String source, String target){
this.source=source; // source文本,来自数据集A的一个文本
this.target=target; //target文本,来自数据集B的一个文本
}
public void run(){
在run方法中计算source文本和target文本的相似度;
}
}
然后在主程序中,用了线程池来管理进程:
public static void main(String[] args) {
File file=new File("/home/fzsu/A");
File sdoc[]=file.listFiles();
file=new File("/home/fzsu/B");
File tdoc[]=file.listFiles();
ExecutorService threadExecutor = Executors.newFixedThreadPool(10);
for (int i=0;i<sdoc.length;i++){ //10000个文本
for (int j=0;j<tdoc.length;j++){ //10000个文本
String sn=sdoc[i].getAbsolutePath();
String tn=tdoc[j].getAbsolutePath();
similarity sim=new similarity(sn, tn);
threadExecutor.submit(cos);
}
}
}
由于线程数(10000*10000)太多,即使已经用了线程池,这样运行一会儿就内存 out -of-memory了,我把线程池允许线程数从10改到2也是会内存溢出。除非让程序不用多线程而是顺序执行才可以,但是这样速度太慢了。
我刚刚学习多线程,还不懂得怎么管理线程,也查了这种导致out-of-memory的常见原因,就是在循环内建立了太多的对象,我这个例子里面就是建了太多 similarity sim=new similarity(sn, tn);,但是实在不知道怎么避免这种操作。或者针对我的问题,是不是有其他更好的设计思路,都麻烦大家给与帮助,谢谢了。 --------------------编程问答-------------------- 解决这类问题,好像都是先抽象化,再比较吧。
怎么可能完全比较两个完整文档呢?那效率得多低呀。
补充:Java , Eclipse