【问题标题】:Processing data incrementally增量处理数据
【发布时间】:2016-07-01 11:43:00
【问题描述】:

我目前正在开发一个系统,用于发现通过使用 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)

【问题讨论】:

    标签: java loops process classification weka


    【解决方案1】:

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

    无论如何,这完全取决于您的库是如何创建的。看起来您正在增量添加数据,但我很确定库只是在累积它。看起来这就是你正在做的 - 将每个负载添加到幼稚,所以最终它会耗尽内存(假设库的语义没有误导)

    如果您不需要天真的所有负载,那么您可能会寻找刷新或删除。如果您确实需要所有负载(并且如果这就是您所有内存的去向),那么您只需要更多的机器内存和更大的 -Xmx。

    找出内存去向的最佳方法是使用 Profiler。它会告诉您哪种对象类型使用的内存最多,并且您可以观察每次迭代还需要多少内存。

    【讨论】:

    • 是的,我已经将它设置为 4GB -Xmx 并尝试了高达 6,真正奇怪的是文件大小实际上只有 6MB,这完全让我在最后一部分
    • 然后尝试在每次迭代中清除 naïve ——或者,如果您一次需要它们,然后获得更大的机器(或更高效的库)
    • 让我说得更具体一些。处理一批时,只在调用bayesins.buildClassifier(naive);之前将给定的数字添加到naïve,然后清除naïve并获取下一批。目前,您似乎只是一次添加一个,但仍将它们全部添加 - 还是我遗漏了什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多