Ошибка при неоднократном доступе к нескольким файлам - PullRequest
0 голосов
/ 21 мая 2019

У меня есть код на 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 Ответ

1 голос
/ 22 мая 2019

Не удалось открыть каталог: слишком много открытых файлов

Это означает, что ваш процесс превысил параметр max open files, который был ему присвоен, смотрите, что с помощью ulimit -aили ulimit -n.Вполне возможно, что вашему процессу на законных основаниях нужно больше fd - если это так, увеличьте ulimit -n и запустите процесс в той же оболочке, в противном случае следуйте приведенным ниже инструкциям.

Если вы хотите увидеть тенденциюдескрипторы открытых файлов видят его с помощью ls /proc/<pid>/fd | wc -l, это даст вам представление о том, как происходит процесс с открытыми файлами.

Эта проблема выглядит как утечка файловых дескрипторов, поэтому для ее легкого использования используйте lsof -p <pid> чтобы увидеть все открытые файлы, которые могут предоставить полезную подсказку.

Если ничего не работает, и проблема кажется запутанной, то используйте профилирование valgrind и используйте флаг track-fd = yes, valgrind --track-fds=yes /path/to/cppBin, чтобы увидеть точные стекивызывает утечку fd.

...