重复访问多个文件时出错

时间:2019-05-21 09:50:43

标签: python c++ file-io resource-leak

我有一个C ++和Python代码,它们通过读写目录中的文件相互通信很多次。读取数据后,它们还会删除某些文件。这是在Ubuntu 17.10上完成的。

但是,多次执行此序列(> 6000-7000次)后,出现以下错误:

Couldn't open the directory: Too many open files

此错误消息总是从C ++代码传递的。

对于 C ++代码

数据写入使用:

std::string opfilepath("/some/path/");
ofstream opfile;
opfile.open (opfilepath);
opfile<<"some stuff"<<endl;
opfile.close()

使用以下方法计算目录中的文件数:

DIR* dirFile = opendir( path );
int count = 0;
if ( dirFile ) 
{
  struct dirent* hFile;
  errno = 0;
  while (( hFile = readdir( dirFile )) != NULL ) 
  {
     if ( !strcmp( hFile->d_name, "."  )) continue;
     if ( !strcmp( hFile->d_name, ".." )) continue;

     if ( strstr( hFile->d_name, ext.c_str() ))
        count++;
  } 

}
closedir( dirFile );

使用以下方式读取文件:

std::ifstream file("/some/path");
if (file.is_open())
    {
      //do something
    }
file.close();

然后使用以下命令删除文件

boost::filesystem::remove("/some/file.txt")

对于 Python 代码:

文件写入使用:

f = open("/some/file.txt", "a")
f.write("some stuff")
f.close()

使用以下方式读取文件:

fp = open(path)
lines = fp.read().splitlines()
fp.close()

然后使用以下命令删除文件

os.remove("/some/path/and/file.txt")

以模块化方式打开和关闭所有文件,同步似乎不是问题。但是我总是看到打开的文件太多,而且总是经过固定的迭代次数。

有什么想法可能会发生这种情况吗?

1 个答案:

答案 0 :(得分:1)

  

无法打开目录:打开的文件太多

这意味着您的进程已超出为其分配的最大打开文件参数,请参见使用ulimit -a或ulimit -n。您的进程可能合法地需要更多fd-如果是这种情况,请增加ulimit -n并在同一shell中启动该进程,否则请遵循以下内容。

如果要查看打开文件描述符的趋势,请使用ls /proc/<pid>/fd | wc -l查看它,它将使您了解打开文件的过程如何进行。

这个问题似乎是文件描述符泄漏,因此使用lsof -p <pid>可以轻松查看所有打开的文件,这可以提供有用的提示。

如果什么都不起作用,并且问题似乎很复杂,则请使用valgrind分析,并使用track-fd = yes标志valgrind --track-fds=yes /path/to/cppBin来查看导致fd泄漏的确切堆栈。