为什么c ++ vector会导致oom-killer?

时间:2013-02-04 16:34:53

标签: c++ vector out-of-memory embedded-linux

代码需要查找和处理尚未在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]);

2 个答案:

答案 0 :(得分:2)

  1. Linux OOM杀手是出了名的愚蠢。默认情况下,不要开始责备自己的代码。
  2. 您只有三个合理尺寸的矢量。 (如果矢量大小不合理,那将是因为单个目录中的文件数量也是不合理的。)
  3. 您不需要new/delete
  4. 由于您不打算运行多线程,因此请考虑制作三个向量static。哈克,但可能只是工作。

答案 1 :(得分:0)

为了节省一些内存,你可以尝试使用string::shrink_to_fit()vector::shrink_to_fit一旦每个字符串或向量达到它的最终大小(当然不是在此之前)。

另一件事可能是,不要先将hours收集到vector,如果这是一个非常长的向量,而是在读取时处理每个目录条目,并以某种方式对所有内容进行排序。