2015-03-26 2 views
0

Когда я запускаю код, показанный ниже, я получаю java.lang.OutOfMemoryError: верхний предел GC превышен на line 16: svm_node node = new svm_node();. Код запускается на массиве ~ 1 млн элементов, где каждый элемент содержит 100 шорт.java.lang.OutOfMemoryError: превышение верхнего предела GC при создании структуры данных для 1 миллиона элементов

// read in a problem (in svmlight format) 
private void read(SupportVector[] vectors) throws IOException 
{ 
    int length = vectors.length; // Length of training data 
    double[] classification = new double[length]; // This is redundant for our one-class SVM. 
    svm_node[][] trainingSet = new svm_node[length][]; // The training set. 
    for(int i = 0; i < length; i++) 
    { 
     classification[i] = 1; // Since classifications are redundant in our setup, they all belong to the same class, 1. 

     // each vector. The vector has to be one index longer than the actual vector, 
     // because the implementation needs an empty node in the end with index -1. 
     svm_node[] vector = new svm_node[vectors[i].getLength() + 1]; 

     double[] doubles = vectors[i].toDouble(); // The SVM runs on doubles. 
     for(int j = 0; j < doubles.length; j++) { 
      svm_node node = new svm_node(); 
      node.index = j; 
      node.value = doubles[j]; 
      vector[j] = node; 
     } 
     svm_node last = new svm_node(); 
     last.index = -1; 
     vector[vector.length - 1] = last; 

     trainingSet[i] = vector; 
    } 

    svm_problem problem = new svm_problem(); 
    problem.l = length; 
    problem.y = classification; 
    problem.x = trainingSet; 
} 

Из исключения, я предполагаю, что сборщик мусора не может должным образом подметать мои новые svm_nodes, но я не могу понять, как я могу оптимизировать создание объекта, чтобы не создавать слишком много новых svn_nodes, что сидит беспомощный в куча.

Я не могу изменить структуру данных, так как это то, что LIBSVM использует в качестве входных данных для своей векторной машины поддержки.

Мой вопрос: Является ли эта ошибка связана с сборщиком мусора, неспособным собрать мои svm_nodes, или я просто пытаюсь проанализировать структуру данных со слишком большим количеством элементов?

PS: Я установил максимальный размер кучи для своего 32-битного приложения (2 ГБ).

+2

Почему вы не используете 64-разрядное адресное пространство для своего приложения? –

+0

Я бы предположил, что больше памяти поможет. В настоящее время многие мобильные телефоны имеют 2 ГБ. Вы можете купить 16 ГБ за 200 долларов. –

+0

Я не уверен, что это проблема. Ошибка указывает, что GC использует слишком много CPU, но вы считаете, что это проблема с кучей памяти? –

ответ

0

Я запустил приложение в 64-битной среде и поднял кучу до более чем 2 гб, что решило проблему. Я все еще верю, что есть странная GC quirk, но я не смог ее найти, и увеличение кучи также решило проблему.