繁体   English   中英

向文件读/写向量的有效方法

[英]Efficient Way to Read/Write Vectors to File

概述:经过几天的研究,我一直无法找到一种快速有效的方法来向/从文件写入/读取向量。 我看到的大多数答案都涉及将每个单独的元素推入/弹出文件。 随着元素数量的增加,这非常耗时。 此外,我一直无法找到解决我的具体问题的尝试。 所以,请确保您的解决方案适用于我的特定情况(即阅读整个问题)。

我的问题:我有一个非常大的数据结构,其中包含有关图像的像素信息。 有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));
}

如果您有任何疑问,请随时提出! 提前致谢。

我没有使用Armadillo,但由于Col是一个1xN矩阵并且应该线性存储,你可以摆脱k循环并一次性写出整个列:

ofile.write((char *)&trainingData[i][j][0], sizeof(double) * trainingData[i][j].size());

如果这不起作用,将Col中的元素复制到本地向量,然后将其写入文件(因为文件操作比复制一些双打要慢得多)。

在编写所有元素之前,您可能还想写出向量的大小,以便知道有多少要读入。

我不得不查看这个Armadillo库的文档,但看起来像Col是一个连续的,密集的矢量类。 我们可以依赖于连续表示来消除嵌套循环,如下所示:

// format: trainingData[60000][2][784, 10]
void SaveTrainingData(const vector<vector<Col<double>>>& trainingData) 
{
    ofstream ofile("VectorizedTrainingData.dat", ios::binary);

    const int numImages = trainingData.size();
    for (int i = 0; i < numImages; i++)
    {
        const vector<Col<double>>& img = trainingData[i];
        const int numCols = img.size();
        for (int j = 0; j < numCols; j++)
        {
            const Col<double>& col = img[j];
            ofile.write((char*)&col[0], col.size()*sizeof(double));
        }
    }
}

调用从列中的一个元素write整列的频率降低可能已经有所帮助。

可能值得对此进行测量,以确保实际上更多的I / O绑定而不是内存限制。 对于所有这些列矢量向量的潜在内存碎片,这有点棘手。

例如,如果内部向量的大小始终相同(例如,每个图像的大小为784像素),您可能可以使用连续的vector<Col>获得更好的结果,或者:

struct Image
{
     Col pixels[768];
};
...
vector<Image> trainingData;

... 或类似的东西。 我无法理解线性代数如何与图像代表联系,但希望这给出了一个想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM