微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

读取 .txt 文件更高效的内存 C++

如何解决读取 .txt 文件更高效的内存 C++

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

.npmrc

但是当我使用编译它

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

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

解决方法

正如评论所说,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);
    }

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。