读取.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(

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

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

最新更新