代码需要查找和处理尚未在embedded-linux上处理的文件。 getDir用于返回目录的已排序内容。 下面的代码在处理了几十个或者可能超过100个文件后完美运行,但随后死于oom-killer。 这是使用c ++向量(循环向量内的循环向量)的坏方法吗? 这种方法可能会造成杀手锏吗? 是否有其他方法可以在不爆炸的情况下工作? 当每个向量超出范围时,是否应该销毁它们? 是否需要使用new / delete? 另外:用于查找内存泄漏的valgrind未集成在此处理器(TI DM368)的sdk中,但代码非常短,并且没有新的语句。注意:实际代码检查sql数据库中是否有已经处理过的文件,但是这段代码仍然引起了oom-killer,并且sql代码被注释掉了,所以为了简单起见,它被遗漏了。文件路径格式为/YYYYmmdd/HH/MMSS.SS.ext。
void getDir (string dir, vector<string> &files) {
...
while ((dirp = readdir(dp)) != NULL) {
files.push_back(string(dirp->d_name));
closedir(dp);
sort(files.begin(), files.end());
while (true) {
vector<string> days;
getDir(database_location, days);
for (uint d=0; d<days.size(); d++) {
vector<string> hours;
getDir(database_location+days[d], hours);
for (uint h=0; h<hours.size(); h++) {
vector<string> files;
string dir = database_location+days[d]+"/"+hours[h];
getDir(dir, files);
for (uint f=0; f<files.size(); f++) process(dir, files[f]);
答案 0 :(得分:2)
new/delete
。由于您不打算运行多线程,因此请考虑制作三个向量static
。哈克,但可能只是工作。
答案 1 :(得分:0)
为了节省一些内存,你可以尝试使用string::shrink_to_fit()和vector::shrink_to_fit一旦每个字符串或向量达到它的最终大小(当然不是在此之前)。
另一件事可能是,不要先将hours
收集到vector,如果这是一个非常长的向量,而是在读取时处理每个目录条目,并以某种方式对所有内容进行排序。