问题:
有没有一种好的方法可以用C++将大小为(90009000,4(的3D浮点矢量写入输出文件
我的C++程序生成一个9000x9000的图像矩阵,每个像素有4个颜色值(R、G、B、a(。我需要将这些数据保存为输出文件,以便稍后使用python读取到numpy.array(或类似文件(中。每个颜色值都保存为一个float(可以大于1.0(,该float将在代码的python部分中进行规范化。
目前,我正在将(90009000,4(大小的矢量写入一个包含8100万行和4列的CSV文件中。这对读写来说很慢,而且会创建大文件(~650MB(。
NOTE: I run the program multiple times (up to 20) for each trial, so read/write times and file sizes add up.
当前C++代码:
这是初始化和写入3D矢量的代码段
// initializes the vector with data from 'makematrix' class instance
vector<vector<vector<float>>> colorMat = makematrix->getMatrix();
outfile.open("../output/11_14MidRed9k8.csv",std::ios::out);
if (outfile.is_open()) {
outfile << "r,g,b,an"; // writes column labels
for (unsigned int l=0; l<colorMat.size(); l++) { // 0 to 8999
for (unsigned int m=0; m<colorMat[0].size(); m++) { // 0 to 8999
outfile << colorMat[l][m][0] << ',' << colorMat[l][m][1] << ','
<< colorMat[l][m][2] << ',' << colorMat[l][m][3] << 'n';
}
}
}
outfile.close();
摘要:
我愿意更改输出文件类型、我使用的数据结构,或者任何其他可以提高效率的东西。欢迎任何建议!
使用旧的C文件函数和二进制格式
auto startT = chrono::high_resolution_clock::now();
ofstream outfile;
FILE* f = fopen("example.bin", "wb");
if (f) {
const int imgWidth = 9000;
const int imgHeight = 9000;
fwrite(&imgWidth, sizeof(imgWidth), 1, f);
fwrite(&imgHeight, sizeof(imgHeight), 1, f);
for (unsigned int i=0; i<colorMat.size(); ++i)
{
fwrite(&colorMat[i], sizeof(struct Pixel), 1, f);
}
}
auto endT = chrono::high_resolution_clock::now();
cout << "Time taken : " << chrono::duration_cast<chrono::seconds>(endT-startT).count() << endl;
fclose(f);
格式如下:
[ImageWidth][ImageHeight][RGBA][RGBA[RGBA]。。。用于所有ImageWidth*ImageHeight像素。
你的样本在我的机器里运行了119秒。这个代码在2秒内运行。
但请注意,无论如何,该文件都将是巨大的:您编写的相当于两个8K文件,没有任何压缩。
除此之外,关于你的代码的一些提示:
- 不要使用浮点向量来表示像素。他们不会有比RGBA更多的组件。相反,创建一个具有四个浮点值的简单结构
- 您不需要分别查看宽度和高度。在内部,所有行都按顺序依次排列。创建宽度*高度大小的一维数组更容易