【发布时间】:2016-02-29 23:19:17
【问题描述】:
概述:经过几天的研究,我一直无法找到一种快速、有效的方法来向文件写入/读取向量。我看到的大多数答案都涉及将每个单独的元素推入/弹出文件。随着元素数量的增加,这非常耗时。此外,我一直无法尝试解决我的特定问题。因此,请确保您的解决方案适用于我的特定情况(即阅读整个问题)。
我的问题:我有一个非常大的数据结构,其中包含有关图像的像素信息。有 60,000 张图像,每张 784 像素。每张图片都是手写数字的图像。因此,除了 60,000 * 784 像素之外,我还需要包含一个标签,以便我知道图像代表哪个数字。我使用的标签,从整个项目的范围来看是必要的,是一个包含 10 种可能性的向量,代表 0、1、2 ... 9,其中只有一个包含“1”/真”,其余为“0”/“假”。此外,由于项目其余部分的线性代数要求,此数据结构要求将信息存储在犰狳线性代数库中使用的“Col”结构中。因此,我希望保存/读取/读取文件的结构声明为std::vector<std::vector<arma::Col<double>>>。
这是我现在用来保存数据的函数,以提供上下文:
void SaveTrainingData(vector<vector<Col<double>>> trainingData) //format: trainingData[60000][2][784, 10]
{
ofstream ofile("VectorizedTrainingData.dat", ios::binary);
for (int i = 0; i < trainingData.size(); i++)
for (int j = 0; j < trainingData[i].size(); j++)
for (int k = 0; k < trainingData[i][j].size(); k++)
ofile.write((char *)&trainingData[i][j][k], sizeof(double));
}
如果您有任何问题,请不要犹豫!提前致谢。
【问题讨论】:
-
void SaveTrainingData(vector<vector<Col<double>>> trainingData)如果您没有按值传递向量,则仅通过函数调用可能会加快速度。此外,您是在启用优化的情况下运行此程序,还是在程序的“调试”未优化版本的情况下运行它?另外,请注意,磁盘 I/O 在某些方面是难以优化的,因为它很大程度上取决于磁盘的性能。