Как сделать код на C++ быстрее: создание файла.csv из данных камеры с использованием CFile
Общий обзор заключается в том, что метод 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 ответа
Просто понял это! Ниже приведена реализация, которая, казалось, выполнила свою работу.
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++;
Как насчет попытки использовать строку целого размера строки
затем на каждой итерации добавляйте свои данные в 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 = ""; } }