0

代码需要查找和处理还没有在embedded-linux上处理的文件。getDir 用于返回目录的排序内容。下面的代码在处理了几十个或可能超过 100 个文件后完美运行,但随后因 oom-killer 而死。这是使用 c++ 向量(循环向量内的循环向量)的坏方法吗?这种方法可能会导致 oom-killer 吗?是否有另一种方法可以在不爆炸的情况下起作用?每个向量超出范围时不应该被销毁吗?是否需要使用 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]);
4

2 回答 2

2
  1. Linux OOM 杀手是出了名的愚蠢。默认情况下,不要开始责怪自己的代码。
  2. 您只有三个大小合理的向量。(如果向量大小不合理,那是因为单个目录中的文件数量也不合理)。
  3. 你不需要new/delete

由于您不会运行多线程,因此请考虑制作三个向量static。哈克,但可能只是工作。

于 2013-02-04T16:42:00.053 回答
0

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

另一件事可能是,不要hours先收集到向量,如果那是一个很长的向量,而是在阅读时处理每个目录条目,然后以某种方式对所有内容进行排序。

于 2013-02-04T16:50:20.717 回答