当前位置:编程学习 > JAVA >>

多线程问题求助

在项目中,有两个数据集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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,