首页 > 解决方案 > 读取 .txt 文件更节省内存 C++

问题描述

我正在研究 C++ 中的神经网络,并希望它在 MNIST 训练集上进行训练。包含所需的所有输入和相应输出的 .txt 文件大小为 301819KB。我目前正在尝试用这些线条阅读它们

vector<vector<float> > inp;
    vector<int> out;
    vector<float> row;
    float buf;
    int bufl;
    for (int outer = 0; outer < 60000; ++outer) {
        for (int reader = 0; reader < 784; ++reader) {
            cin >> buf;
            row.push_back(buf);
        }
        inp.push_back(row);
    }
    for (int label = 0; label < 60000; ++label) {
        cin >> bufl;
        out.push_back(bufl);
    }

但是,当我使用它编译它时

g++ -o nn main.cpp

然后使用

nn < out.txt

几秒钟后出现一个错误,上面写着:内存不足。有没有办法让我将 .txt 文件读取到向量中,以提高内存效率,或者以某种方式让程序访问更多内存?该程序仅使用大约 1.2GB 的内存(我认为仅读取 300MB 的输入文件仍然是相当低效的内存)所以我仍然有足够的内存可以使用(我有 16GB)

标签: c++memory-managementcin

解决方案


正如评论所说,row永远不会被清除,所以它会永远增长。这是对向量进行了一些优化的固定版本:

    vector<vector<float> > inp;
    vector<int> out;
    vector<float> row;

    // reserve known sizes
    constexpr size_t kNumSamples = 60000;
    constexpr size_t kRowLength = 784;
    inp.reserve(kNumSamples); 
    row.reserve(kRowLength);
    out.reserve(kNumSamples); 

    float buf;
    int bufl;
    for (int outer = 0; outer < kNumSamples; ++outer) {
        for (int reader = 0; reader < kRowLength; ++reader) {
            cin >> buf;
            row.push_back(buf);
        }

        // move the row into the input vector, this will also reset the row
        inp.push_back(std::move(row));
    }
    for (int label = 0; label < kNumSamples; ++label) {
        cin >> bufl;
        out.push_back(bufl);
    }

您还可以进行其他更改(例如在使用它们的范围内声明变量),但为了尽可能匹配输入代码,我将它们排除在外。


推荐阅读