C++ 为什么c++;矢量杀手?

C++ 为什么c++;矢量杀手?,c++,vector,out-of-memory,embedded-linux,C++,Vector,Out Of Memory,Embedded Linux,代码需要查找和处理尚未在嵌入式linux上处理的文件。 getDir用于返回目录中已排序的内容。 下面的代码在处理了几十个或可能超过100个文件后工作得很好,但随后随着oom killer的出现而消失。 这是不是使用C++向量(循环向量在循环向量中)的坏方法? 这个方法会导致oom杀手吗? 有没有其他方法可以在不爆炸的情况下工作? 每个向量不应该在超出范围时被销毁吗? 是否需要改用“新建/删除”? 另外:用于查找内存泄漏的valgrind没有集成在此处理器(TI DM368)的sdk中,但代码非

代码需要查找和处理尚未在嵌入式linux上处理的文件。 getDir用于返回目录中已排序的内容。 下面的代码在处理了几十个或可能超过100个文件后工作得很好,但随后随着oom killer的出现而消失。 这是不是使用C++向量(循环向量在循环向量中)的坏方法? 这个方法会导致oom杀手吗? 有没有其他方法可以在不爆炸的情况下工作? 每个向量不应该在超出范围时被销毁吗? 是否需要改用“新建/删除”? 另外:用于查找内存泄漏的valgrind没有集成在此处理器(TI DM368)的sdk中,但代码非常短,没有新的语句。注意:实际的代码检查sql数据库中已经处理过的文件,但是这段代码仍然导致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]);
void getDir(字符串目录、向量和文件){
...
而((dirp=readdir(dp))!=NULL){
文件。向后推(字符串(dirp->d_名称));
closedir(dp);
排序(files.begin(),files.end());
while(true){
病媒日;
getDir(数据库位置,天);
对于(uint d=0;d
  • Linux OOM killer是出了名的愚蠢。默认情况下,不要开始责怪自己的代码
  • 您只有三个大小合理的向量(如果向量大小不合理,那是因为单个目录中的文件数也不合理)
  • 您不需要
    新建/删除

  • 因为你不打算运行多线程,考虑做三个向量<代码>静态< /代码> .HACK,但可能只是工作。

    保存一些内存,你可以尝试使用,并且一旦每个字符串或向量都在最后的大小(当然不是在那之前)。
    另一件事可能是,不要先将
    hours
    收集到vector,如果这是一个很长的向量,而是在读取每个目录条目时对其进行处理,然后以某种方式对所有内容进行排序。

    最终的
    for循环
    (使用
    process()
    )会有多深注释掉了吗?即使几百个文件在一百个文件路径名中有200个字符,其中包括您仅查看的大约250-300K内存的路径。您可以通过先构建文件列表,然后在其上构建std::for_each()来将其缩短为只包含最终的全名。例如,使用三层
    readdir()
    循环构建文件名,一旦构建完所有文件名(没有中间向量),对其进行排序,然后通过
    process()
    运行所有文件名。结果的顺序应该相似,但对内存的影响较小。