Как сделать код на C ++ быстрее: создание файла .csv из данных камеры с использованием CFile - PullRequest
0 голосов
/ 31 января 2019

Общий обзор заключается в том, что метод file.write () файла CFile вызывается для каждого отдельного целочисленного значения данных (строка 9) вместе со строкой 12, где я записываю запятую в файл.

Это означает, что для 327 680 целых входных данных существует 2 * 327 680 = 655 36060 вызовов file.write ().Код очень медленный из-за этого, и в результате код занимает 3 секунды, чтобы создать один CSV-файл.Как я могу повысить эффективность моего кода?

Примечание: я не могу изменить какие-либо объявления кода.Я должен использовать CFile.Кроме того, pSrc имеет тип uint_16_t и содержит данные, которые я хочу сохранить в файле .csv.Диапазон данных составляет от 0 до 3000 целых значений.

1           CFile file;
2           int mWidth = 512;
3           int mHeight = 640;
4           UINT i = 0;
5           char buf[80];
6           UINT sz = mHeight * mWidth; //sz = 327,680
7           while (i < sz) {
8                  sprintf_s(buf, sizeof(buf), "%d", pSrc[i]); 
9                  file.Write(buf, strlen(buf));
10                 i++;
11                 if (i < sz)  
12                        file.Write(",", 1);
13                 if (i % mWidth == 0) 
14                        file.Write("\r\n", 2);
15  }

Все значения выводятся в файл 640x512 .csv, содержащий целые числа, представляющие градусы Цельсия.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Только что понял!Ниже приведена реализация, которая, казалось, выполнила свою работу.

int sz = mHeight * mWidth;

std::string uniqueCSV = "Frame " + to_string(miCurrentCSVImage + 1) + ".csv";
std::string file = capFile + "/" + uniqueCSV;
std::ofstream out;
out.open(file);

std::string data = "";

int i = 0;
while (i < sz) {
    data += to_string(pSrc[i]);
    i++;
    if (i < sz)
        data += ",";
    if (i % mWidth == 0)
        data += "\n";
}

out << data;
out.close();
miCurrentCSVImage++;
0 голосов
/ 31 января 2019

как насчет попытки использовать строку целого размера строки

, затем на каждой итерации добавлять свои данные в buf и запятую (объединяя всю строку в buf) и когда вы добираетесь до

 if (i % mWidth == 0)

записать всю строку в CFile и очистить ваш буфер, используя

как-то так

UINT sz = mHeight * mWidth; std::string line = "";
while (int i < sz) { line += std::to_string(pSrc[i])) + ','; i++;
if (i % mWidth == 0) { 
file.Write(line.c_str(), line.size()); 
file.Write("\r\n", 2); 
line = ""; } }
...