逐步处理数据

时间:2016-03-15 20:21:29

标签: java loops process classification weka

我目前正在开发一个系统,用于发现通过使用Wekas机器学习套件和分类器形成的关联。我的主要问题是,在构建分类器时耗尽的内存量超过了我的机器可能分配的内存量,导致它失败并且所有内容都停止了。我以为我发现通过使用Naivebayes的可更新版本,这将允许我逐步将数据添加到分类器,我可以为读者设置容量变量,但是我不断得到我认为已经解决的相同问题!代码和堆栈跟踪可以在下面找到。寻找任何解释,因为所有问题/例子都经过检查无济于事。

package model;

import java.io.BufferedReader;
import java.io.FileReader;
import weka.core.Instances;
import weka.classifiers.bayes.NaiveBayesUpdateable;
import weka.core.Instance;
import weka.core.converters.ArffLoader;
import weka.core.converters.ArffLoader.ArffReader;

import java.io.File;

public class Naivebayes {

public static void main(String args[]) throws Exception {

String [] bayoptions = new String []{"-O"};

NaiveBayesUpdateable bayesins = new NaiveBayesUpdateable();
bayesins.setOptions(bayoptions);
bayesins.setDisplayModelInOldFormat(true);

        BufferedReader read = 
new BufferedReader(new FileReader("/Users/GinoRondelli/workspace/Movies/src/data/200TagsBroo.arff"));

ArffReader  load = new ArffReader(read, 5000);
Instances naive = load.getStructure();
naive.setClassIndex(naive.numAttributes()-198);
Instance current;
while ((current = load.readInstance(naive)) != null){
        naive.add(current);
    }   
  bayesins.buildClassifier(naive);
 System.out.println(bayesins);  
 }
}

堆栈跟踪:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at weka.estimators.DiscreteEstimator.<init>(DiscreteEstimator.java:59)
at weka.classifiers.bayes.NaiveBayes.buildClassifier(NaiveBayes.java:298)
at model.Naivebayes.main(Naivebayes.java:39)

1 个答案:

答案 0 :(得分:0)

我认为这不是问题,但作为一个非常基本的检查,你在命令行上有一个合理的-Xmx ......?不要超过你的计算机的ram(作为一个指导原则,让你的操作系统也有一些ram - 你不需要java交换),但默认设置非常低,所以值得问。

无论如何,这一切都取决于你的图书馆是如何创建的。看起来你正在逐步添加数据,但我很确定库正在积累它。它看起来就像你正在做的那样 - 将每个负载添加到天真,所以最终它会耗尽内存(假设库的语义没有误导性)

如果您不需要天真的所有负载,那么您可能会寻找同花或移除。如果你确实需要所有的负载(以及所有内存的IF)那么你只需要更多的机器内存和更大的-Xmx。

找出记忆力的最佳方法是Profiler。它将告诉您哪种对象类型使用的内存最多,您可以观察每次迭代需要多少内容。