2015-04-02 6 views
0

Я использую javaml для обучения классификатора. Теперь экземпляры в моих данных содержат векторы в формате, как этотjavaml java.lang.OutOfMemoryError: Java heap space

1 0: 5 1: 9 24: 2 ......

поэтому, когда я прочитал это из файла я использую строку. Трещина. Затем добавьте значения в sparseinstance, которые затем добавляются в классификатор.

Однако я получаю пустое место из памяти. Я читал о том, что string.split() вызывает утечку памяти, поэтому я использовал новую строку, чтобы избежать утечки памяти. Однако я по-прежнему сталкивается с проблемой кучи пространства

Код выглядит следующим образом

/////////////////////////// /////////////

BufferedReader br = new BufferedReader(new FileReader("Repository\\IMDB Data\\Train.feat")); 
Dataset data=new DefaultDataset(); 
String TrainLine; 
int j=0; 
while((TrainLine = br.readLine()) != null && j < 20000){ 
       //TrainLine.replaceAll(":", " "); 
       String[] arr = TrainLine.split("\\D+"); 
       double[] nums = new double[arr.length]; 
       for (int i = 0; i < nums.length; i++) { 
        nums[i] = Double.parseDouble(new String(arr[i])); 
       } 
       //vector has one less element than arr 85527 
       String label; 
       if(nums[0] == 1){ 
        label = "positive"; 
       }else{ 
        label = "negative"; 
       } 
       System.out.println(label); 
       Instance instance = new SparseInstance(85527,label); 
       int i; 
       for(i=1;i<arr.length;i=i+2){ 
        instance.put((int)nums[i],nums[i+1]); 
        //Strings have been converted to new strings to overcome memory leak 
       } 
       data.add(instance); 


        j++; 
      } 
      knn = new KNearestNeighbors(5); 
      knn.buildClassifier(data); 

      svm = new LibSVM(); 
      svm.buildClassifier(data); 

////////////////////////////// //////////

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space 
    at java.util.TreeMap.put(Unknown Source) 
    at java.util.TreeSet.add(Unknown Source) 
    at java.util.AbstractCollection.addAll(Unknown Source) 
    at java.util.TreeSet.addAll(Unknown Source) 
    at net.sf.javaml.core.SparseInstance.keySet(SparseInstance.java:144) 
    at net.sf.javaml.core.SparseInstance.keySet(SparseInstance.java:27) 
    at libsvm.LibSVM.transformDataset(LibSVM.java:80) 
    at libsvm.LibSVM.buildClassifier(LibSVM.java:127) 
    at backend.ShubhamKNN.<init>(ShubhamKNN.java:55) 
+0

http://stackoverflow.com/questions/37335/how-to-deal-with-java-lang-outofmemoryerror-java-heap- space-error-64mb-heap – Pratik

+0

что-то не так с вашим объектом DataSet. это может быть неудачным в 'knn.buildClassifier (data);' – Prashant

+0

@Prashant набор данных прекрасен, и он не терпит неудачу в knn.buildClassifier (данные). –

ответ

0

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

Вы можете запустить свой код всего за 1000 записей, я думаю, он работает нормально. Стоимость много памяти проблема Libsvm, это всегда происходит ошибка:

java.lang.OutOfMemoryError: Java heap space 

, если ваш компьютер имеет достаточно памяти (у меня это 8G), вы можете настроить параметров памяти класса в Eclipse:

  1. выбрать класс, который вызывает libsvm LIB в Package Explorer View

  2. в меню Run -> Run конфигурации .. -> вкладка (х =) аргументы - ввод аргументов VM, тип в -Xmx1024M. это означает, что класс может стоить максимум памяти 1024 М, я устанавливаю параметр 3072M, мой класс работает нормально.

  3. повторный класс.

выше мое решение, более подробно см: http://blog.csdn.net/felomeng/article/details/4688414

Смежные вопросы