Написал примитивную программу на С++, которая просто ищет определенные файлы на дисках системы, написал, откомпилил, заработало. Но как то странно комп стал притормаживать, посмотрев в диспечере задач, оказалась что моя программа жрет 1,5 гигабайта(!) файла подкачки... Можно как нить её урезать в этом? а то работа на компе становиться невыносимой. Что можно сделать в этом случае?
ring4 Сказанного явно недостаточно для точного ответа. Получишь кучу гипотез. Привел бы сорец. Один совет - урежь размер файла подкачки.
Вот даже такая структура даёт бешенный скачек в памяти: Код (Text): int WINAPI WinMain(HINSTANCE, HINSTANCE, PTSTR, int) { for (;;) { // Вводим строки логических дисков char buf[] = {'D', 'E', 'F', 'G', 'H', 'S', 'J', 'K', 'L', 'M', 'N', 'W', 'Y', 'X','I','V'}; // Осуществляем поиск по дискам на наличие файла WIN32_FIND_DATA FindFileData; HANDLE hf; for (int i = 0; buf[i]; i++) { /////////////////////////////// string dis; dis = buf[i]; string path = ":\\test.txt"; string s1 = dis + path; ////////////////////////////// hf=FindFirstFileA(s1.c_str(), &FindFileData); if (INVALID_HANDLE_VALUE!=hf){ //ОК } } } } Даже если убрать бесконечный цикл, все равно не поможет. Пробывал в системе уменьшить файл подкачки, все равно, программа жрёт все что доступно.
ring4 Похоже система делает prefetch files, а поскольку ты шаришь по всему диапазону логических дисков, то все предварительное чтение сливается в файл подкачки.
На ваш вопрос есть два ответа - простой и правильный. Простой ответ - читаем Рихтера и помещаем программу в Job, на который выставляем ограничения по памяти (Max commit limit for job / for process). Правильный ответ - читаем MSDN, забиваем на FindFirstFile/FindNextFile и юзаем indexing service. Там даже примеры есть, например AdvQuery.
Все. Определил какая структура вешает систему, хотя не до конца понял почему, может вы разясните. Код (Text): string buf[] = {"\\\\.\\D:", "\\\\.\\E:", "\\\\.\\F:", "\\\\.\\G:", "\\\\.\\H:", "\\\\.\\S:", "\\\\.\\J:", "\\\\.\\K:", "\\\\.\\L:"}; for (int i = 0; buf[i]; i++) { string ppp; ppp = buf[i]; // <- вот то злополучное место, если его закоментировать, то все путем } помоему вся беда в том что массив обявлен как string, хотя ничем другим обявить неполучается.
ring4 если, честно, мне уже просто смешно.. только без обид ) ps: FindClose в этом своем точно не забыл?
Nouzui да закрытие есть, ибо утечку ресерсов не избежать. Хотя я уже разобрался в своей проблеме. проблема в for в условии выхода если поставить for (int i = 0; i < sizeof(buf)/sizeof(string) ; i++) то все работает. Тема закрыта.