| Forum / Linux / Limit otwieranych plików? |
| Autor | Wiadomość |
| Jan Stożek
|
Posted: 8 Lut 2010 19:59:32 Witam, Piszę sobie program w C++, który wczytuje pewną liczbę danych z niewielkich plików. Każdy plik otwieram do odczytu, wczytuję zawartość i explicite zamykam. Tymczasem po wczytaniu 340 plików (dokładnie!) kolejne próby otwarcia pliku już się nie udają. Czy to jakiś bug, feature, czy ograniczenie środowiska albo systemu? gcc 4.3.2, OpenSUSE 11.2, kernel 2.6.27.42. Z góry dzięki za hint. |
| Kamil Jońca
|
Posted: 8 Lut 2010 20:06:03 Witam,
Piszę sobie program w C++, który wczytuje pewną liczbę danych z niewielkich plików. Każdy plik otwieram do odczytu, wczytuję zawartość i explicite zamykam. Tymczasem po wczytaniu 340 plików (dokładnie!) kolejne próby otwarcia pliku już się nie udają. Czy to jakiś bug, feature, czy ograniczenie środowiska albo systemu? A skąd my mamy to wiedzieć bez a) kodu b) kodu błędu KJ |
| Jan Stożek
|
Posted: 8 Lut 2010 20:48:20 Po głębokim namyśle Kamil Jońca napisał w poniedziałek, 8 lutego 2010 21:06: a) kodu
b) kodu błędu Kod jest dość rozproszony. Nevertheless: ModelCalculator::ModelCalculator (string FileName) { // Tu jest inicjacja innych atrybutów obiektu static int count = 0; ifstream LoadFile(FileName.c_str(), ifstream::in); if (LoadFile.is_open()) { // Tu następuje wczytanie zawartości LoadFile.close(); cout << "Opened: " << count++ << endl; } } I wywołanie: { DIR * dirp; dirent * dp; if ((dirp = opendir(DAT_DIR))) { while ((dp = readdir(dirp)) != NULL) { string FileName = dp-d_name; if (FileName.rfind(DAT_EXT) != string::npos) { _model.push_back(new ModelCalculator(DAT_DIR + FileName)); } } closedir(dirp); } } _model jest wektorem obiektów typu ModelCalculator, DAT_DIR - wskazuje na katalog z plikami danych, DAT_EXT - zawiera rozszerzenie pliku danych. Kod trochę oczyściłem z fragmentów mało istotnych. Kodu błędu jako takiego nie ma - ani konstruktor ani metoda open klasy ifstream go nie zwracają. Bity statusu klasy (failbit, badbit, eofbit) raczej nie zawierają szczegółowych informacji z systemu plików ("failbit is generally set by an input operation when the error was related with the internal logic of the operation itself, while badbit is generally set when the error involves the loss of integrity of the stream, which is likely to persist even if a different operation is performed on the stream"), więc nawet ich nie sprawdzam. Nie jest to związane ani z uprawnieniami, ani z istnieniem plików - pliki niczym specjalnym się nie odróżniają od pozostałych, zresztą poza programem otwieram je bez problemu. Kontrolnie skasowałem kilka plików, które program otwierał i okazało się, że liczba otwartych plików pozostała bez zmian - po prostu program otworzył kilka dalszych. A to IMHO sugeruje istnienie ograniczeń po stronie systemu (?) - w każdym razie nie związanego ani z algorytmem ani z systemem plików. |
| Wojciech Jaczewski
|
Posted: 8 Lut 2010 22:03:30 Sprawdź przy pomocy programu strace, czy rzeczywiście pliki są zamykane, oraz jaki błąd zwraca system operacyjny przy nieudanej próbie otwarcia kolejnego pliku. |
| Jasio
|
Posted: 10 Lut 2010 21:41:02 Sprawdź przy pomocy programu strace, czy rzeczywiście pliki są zamykane,
oraz jaki błąd zwraca system operacyjny przy nieudanej próbie otwarcia kolejnego pliku. strace pokazał: EMFILE (Too many open files). Ale przy okazji wyszło szydło z worka: otóż zupełnie zapomniałem, że każdy obiekt otwierał w konstruktorze osobny plik logu, w którym miał rejestrować swoje działania. No i to wyczerpało pulę... Wielkie dzięki za pomoc. -- Pozdrawiam, (js). |
|
Czas ładowania strony (sek.): 0.404 users miniBB.net © 2001-2010 | Polityka Prywatności e-giełdy + opisy gg + kumy fubi ° oko na maroko ° nimda °
|