重复访问多个文件时出错
Error while accessing multiple files repeatedly
我有一个 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")
所有文件都以模块化方式打开和关闭,同步似乎不是问题。但我一直看到 打开的文件太多,并且总是在固定次数的迭代之后。
知道为什么会这样吗?
Couldn't open the directory: Too many open files
这意味着您的进程已超过分配给它的最大打开文件参数,请使用 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 泄漏的确切堆栈。
我有一个 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")
所有文件都以模块化方式打开和关闭,同步似乎不是问题。但我一直看到 打开的文件太多,并且总是在固定次数的迭代之后。
知道为什么会这样吗?
Couldn't open the directory: Too many open files
这意味着您的进程已超过分配给它的最大打开文件参数,请使用 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 泄漏的确切堆栈。