2015-08-19 3 views
-1

Я работаю над программой на Java, которая имеет целью проанализировать ее определенными способами.Память Java/количество записей ограничено?

В один момент мне нужно добавить определенные значения в зависимости от alorithem в течение последнего п (например) строк:

private void eFSF(PFCC pfCC, csvReader reader) { 
     List<List<String>> fileDataList; 
     reader.changeModulo(1); 
     fileDataList = reader.parseToList(); 
     HashMap<Long, List<String>> hashedList = new HashMap<>(); 

     long rowCnt = 0L; 
     for (List<String> list : fileDataList) { 
      hashedList.put(rowCnt, list); 
      rowCnt++; 
     } 

     AWI wI = getWI(pfChainContext, fileDataList); 
     hashedList.get(0L).add(setFeatureHeader()); 

     //iterate over without header 
     long iterCnt = 1L; 
     long moduloCnt = 0L; 
     LinkedList<Long> lastLines = new LinkedList<>(); 
     for (Long line : hashedList.keySet()) { 
      if (line == 0L) 
       continue; 

      // check measure start, first measurement 
      if (hashedList.get(line).get(1).equals("0")) { 
       moduloCnt = 0L; 
      } 

      if(moduloCnt % pfChainContext.getEsize() == 0 || pfChainContext.size() == 1){ 
       if (lastLines.size() != 0) { //prob first line 
        moduloTrigger(hashedList, wIter, lastLines); 

        //clean Data 
        lastLines.clear(); 
        wIter.clear(); 
       } 
      } 

      wIter.addLine(hashedList.get(line)); 
      lastLines.add(iterCnt); 
      moduloCnt++; 
      iterCnt++; 
     } 

     // if some "hangover" lines exist: 
     if (lastLines.size() != 0) { 
      moduloTrigger(hashedList, wIter, lastLines); 
     } 

     //write File Back 
     ... 
    } 

private void moduloTrigger(HashMap<Long, List<String>> fileDataList, AWI wIter, LinkedList<Long> lastLines) { 
    fileDataList.get(lastLines.getFirst()).add((String)wIter.getDFCW()); 

    //fill with zeros 
    for (Long i : lastLines.subList(1, lastLines.size())) 
     fileDataList.get(i).add("0"); 
} 

В общем algorithem работает нормально. Но я столкнулся со следующей проблемой: После ~ 65536-й строки некоторые из данных ошибочны на один шаг.

Я уверен, что это имеет какое-то отношение к переменным ограничениям, но изменение числа на Long не изменило ситуацию. После отладки кода я узнал, что проблема уже существует в Datastructure, поэтому она не имеет ничего общего с записью данных.

Я работаю над 64-разрядной машиной с 64-разрядной Java.

У кого-нибудь есть идея, почему он продолжает возиться с линиями?

ответ

1

65536 - наименьшее значение, которое не может быть представлено как Java char. Все остальные типы имеют либо меньшие пределы (127 для byte, 32767 для short), либо значительно больше.

  • byte является 8b подписано
  • short является 16b подписано
  • char является 16b беззнаковое
  • int является 32b подписано
  • long является 64b подписано
  • float является 32b подписан плавающий, так 23b мантиссы
  • double является 64b подписан плавающим, так 52b мантисса

, но изменение числа на Поплавок

Изменением интегрального типа для Float не поможет вам так же, как изменить его к большему интегральному типу ,

Я работаю над 64-разрядной машиной с 64-разрядной Java.

Это влияет на количество адресной памяти и объем памяти, потребляемой ссылками на объекты, но не битовую ширину числовых примитивов в Java.

+0

Sry я имел в виду долго, а не плавать. Каковы пределы списков? Может ли это также быть возможной ошибкой? – Xlaech

+0

@NicolasAntor: * «Возможно ли это быть возможной ошибкой?» * ... Платформа Java постоянно разрабатывается, тестируется и оптимизируется уже более 15 лет. Очень маловероятно, что проблема, с которой вы сталкиваетесь, связана с особенным или ошибочным поведением на языке. – scottb

+0

Вы, наверное, не поняли мой вопрос. Конечно, я не обвиняю JVM в каких-либо проблемах. Но Спецификация может просто ограничить размер списков другими структурами данных, как раз то, как они ограничивают числа. – Xlaech

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