Обработка - принтер/перечисление не завершено

Я использую обработку в сочетании с kinect для захвата данных облака точек. Мой скетч записывает векторное расположение точек из kinect в массив и использует класс PrintWriter для создания текстовых файлов, в которых все точки из каждого кадра хранятся в отдельных текстовых файлах. Он включает в себя условное выражение, которое должно помешать печатному писателю писать, но оно продолжает писать и в конце концов зависает. Любые идеи относительно того, что может быть не так? Вот мой код:

При записи:

PVector realWorldPoint; //stores each point as a vector
PVector[] frame = new PVector[arrayLength]; //stores all of the vectors/real world points in an array
int index = 0;

for(int y=0;y < context.depthHeight();y+=steps) //height = 480
{
    for(int x=0;x < context.depthWidth();x+=steps) //width = 640
    {
      if (isRecording == true){
        int offset = x + y * context.depthWidth();
        realWorldPoint = context.depthMapRealWorld()[offset];
        frame[index] = realWorldPoint;
        recording.add(frame);
        index++;
      }
    }
}

И при сохранении:

if (isRecording == true){
  isRecording = false;
  println("Stopped Recording");
  Enumeration e = recording.elements();
  int i = 0;
  while (e.hasMoreElements()) {

    // Create one directory
    boolean success = (new File("out"+currentFile)).mkdir(); 
    PrintWriter output = createWriter("out"+currentFile+"/frame" + i++ +".txt");
    PVector [] frame = (PVector []) e.nextElement();

    for (int j = 0; j < frame.length; j++) {
     output.println(j + ", " + frame[j].x + ", " + frame[j].y + ", " + frame[j].z );
    }
    output.flush(); // Write the remaining data
    output.close(); //Doesn't seem to close
  }
  println("done recording"); //NEVER EXECUTES
}

Это большие файлы (около 12 000 строк), и я создаю около 30 таких файлов в секунду. Может быть, он просто перегружается, поэтому стоп никогда не регистрируется? Также не уверен насчет перечисления - это было скопировано из чужого кода, но я не вижу документации по этому типу данных.


person mheavers    schedule 18.07.2012    source источник


Ответы (1)


Я не уверен, почему ваша программа не завершается, но хранить данные о глубине в виде простого текста определенно плохая идея. Написание 30 файлов с 12 000 строк в секунду — это, безусловно, большая работа, вызывающая множество переключений контекста между приложением и ОС.

В качестве альтернативного способа сохранения данных я предлагаю записывать кадры в файл, используя исходный двоичный формат. Это сэкономит много места и времени записи, поскольку координаты x и y подразумеваются структурой фрейма, а координата z не занимает 1 байт на цифру.

Дополнительным улучшением будет сборка того, что вы собираетесь записать в память, и сразу запись в файл. Прямо сейчас дело за PrintWriter, когда на самом деле записывать файлы на диск - нет гарантии, что он будет ждать вызова для сброса.

Согласно этому, вы использовали Enumeration правильно, поэтому я не думаю, что есть проблема с этим.

Вывод: Вполне вероятно, что нагрузка на запись вызывает зависание программы. Вы узнаете, как только запись данных станет более эффективной.

person Chris Ortner    schedule 19.07.2012
comment
Предполагая, что вы используете simple-openni, context.depthMap() предоставляет массив int со значениями глубины. На самом деле я не профессионал в области обработки, поэтому не могу сказать, как правильно написать массив int, но я думаю, что saveBytes() (processing.org/reference/saveBytes_.html) может быть хорошим началом. Извините, что я могу помочь вам только на концептуальном уровне. - person Chris Ortner; 19.07.2012
comment
Лучше чем ничего. Спасибо - буду добиваться. - person mheavers; 19.07.2012