Лучший способ сохранить много потоковых данных с iPhone - PullRequest
0 голосов
/ 31 октября 2019

В настоящее время я передаю данные изображения и глубины с моего iphone X и выполняю серию вычислений на нем, используя ядро ​​compute metal. Выход каждого цикла (кадра) составляет примерно 900 000 операций с плавающей запятой. Предполагая, что имеется 30 циклов (кадров) в секунду, это представляет 27 миллионов операций с плавающей запятой в секунду.

Я хотел бы сохранить несколько секунд (3-5) этих данных в файл, к которому я смогу получить доступ позже,

Мой текущий подход к записи выходных данных в каждом цикле слишком медленный (ввод-вывод дорогой), и я не уверен, как правильно буферизовать результаты нескольких циклов (я пытался создать массив массивов, но потомстолкнуться с проблемами с памятью).

Копировать данные из буферов MTL:

    //number of elements per frame approx 300,000
    size_t len = elementCount
    finalArrayX = new float [len];
    finalArrayY = new float [len];
    finalArrayZ = new float [len];

    //MTLBuffers
    finalArrayX = (float*) resultsBufferX.contents;
    finalArrayY = (float*) resultsBufferY.contents;
    finalArrayZ = (float*) resultsBufferZ.contents;

    writeToFile(finalArrayX, finalArrayY, finalArrayZ)

writeToFile:

    /*
    * Get file handle to append to 
    */

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *documentTXTPath = [documentsDirectory stringByAppendingPathComponent:@"test.txt"];

    if(![[NSFileManager defaultManager] fileExistsAtPath: documentTXTPath]) {
        [[NSFileManager defaultManager] createFileAtPath: documentTXTPath contents:nil attributes:nil];
    }
    NSFileHandle *myHandle = [NSFileHandle fileHandleForWritingAtPath:documentTXTPath];
    [myHandle seekToEndOfFile];

    /*
    * Create strings and write line by line
    */

    for(int k = 0; k < elementCount; k ++){  

        NSString *x_i = [NSString stringWithFormat:@"%.2f", finalArrayX[k]];
        NSString *y_i = [NSString stringWithFormat:@"%.2f", finalArrayY[k]];
        NSString *z_i = [NSString stringWithFormat:@"%.2f", finalArrayZ[k]];

        NSString *temp = [line stringByAppendingString: x_i];
        temp = [temp stringByAppendingString: @" "];
        NSString *tempTwo = [temp stringByAppendingString: y_i];
        tempTwo = [tempTwo stringByAppendingString: @" "];
        NSString *tempThree = [tempTwo stringByAppendingString: z_i];
        NSString *totalLine = [tempThree stringByAppendingString: @"\n"];
        [myHandle writeData:[totalLine dataUsingEncoding:NSUTF8StringEncoding]];
    }

Как лучше всего это сделать?

...