我有一个多标签文本分类问题,我尝试使用二进制相关性方法解决,通过为每个标签创建一个二进制分类器。 我必须阅读10000个模型分类器来执行我的分类阶段,在我的训练阶段之后,在我的所有文档上,使用spark。 但是由于一个未知的原因,当我尝试读取超过1000个模型时它变得非常慢,因为spark每次都会创建一个新线程,这会逐渐减慢进程,我不知道为什么。 这是解释我问题的最小代码。
package entrepot.spark;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.spark.ml.classification.MultilayerPerceptronClassificationModel;
import org.apache.spark.sql.SparkSession;
public class maintest {
public static void main(String[] args) throws FileNotFoundException, IllegalArgumentException, IOException {
try(SparkSession spark = SparkSession.builder().appName("test").getOrCreate()) {
//Listing directories to get the list of labels
Set<String> labels = new HashSet<>();
FileStatus[] filesstatus = FileSystem.get(spark.sparkContext().hadoopConfiguration()).listStatus(new Path("C:\\Users\\*\\Desktop\\model\\"));
for(int i = 0; i < filesstatus.length; i++) {
if(filesstatus[i].isDirectory()) {
labels.add(filesstatus[i].getPath().getName());
}
}
List<MultilayerPerceptronClassificationModel> models = new ArrayList<>();
// Here is the problem
for(String label : labels) {
System.out.println(label);
MultilayerPerceptronClassificationModel model = MultilayerPerceptronClassificationModel.load("C:\\Users\\*\\Desktop\\model\\" + label + "\\CL\\");
models.add(model);
}
System.out.println("done");
}
}
}
我在Windows上使用Spark 2.1.1和Hadoop 2.7.3运行程序,使用以下命令行:
.\bin\spark-submit^
--class entrepot.spark.maintest^
--master local[*]^
/C:/Users/*/eclipse-workspace/spark/target/spark-0.0.1-SNAPSHOT.jar
要下载我的一个标签模型的小型重复样本,这里是链接:we.tl/T50s9UffYV(为什么我不能发布一个简单的链接?)
PS:即使模型是可序列化的,我也无法使用java集合和对象流一次保存和加载所有内容,因为我收到了scala转换错误。相反,我在每个模型上使用MLLib的save / load静态方法,导致数十万个文件。