c++ - 读取 .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);
}
您还可以进行其他更改(例如在使用它们的范围内声明变量),但为了尽可能匹配输入代码,我将它们排除在外。
推荐阅读
- angularjs - $element.on("$destroy", fn) 和 $scope.$on("$destroy", fn) 在摘要循环中的作用有什么区别?
- typescript - 使用 Typescript 时的 Phaser 全局变量
- excel - rs.open 中的 FROM 子句 Excel VBA 中的语法错误
- .net - Kubernetes 上的 SiloHost
- javascript - Angular 2+中的“this.model”方法和文件?
- rstudio - 无法使用 Linux Mint 18 Cinnamon 启动 RStudio
- javascript - FlatList 项目总是得到最后一个项目
- python - TensorFlow UnimplementedError
- react-native - Redux 存储问题
- java - 使用 J2Html 旋转 Div