Когда я запускаю код, показанный ниже, я получаю 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 ГБ).
Почему вы не используете 64-разрядное адресное пространство для своего приложения? –
Я бы предположил, что больше памяти поможет. В настоящее время многие мобильные телефоны имеют 2 ГБ. Вы можете купить 16 ГБ за 200 долларов. –
Я не уверен, что это проблема. Ошибка указывает, что GC использует слишком много CPU, но вы считаете, что это проблема с кучей памяти? –