урезать программу в использовании ресурсов системы

Тема в разделе "WASM.BEGINNERS", создана пользователем ring4, 21 мар 2007.

  1. ring4

    ring4 New Member

    Публикаций:
    0
    Регистрация:
    19 ноя 2006
    Сообщения:
    279
    Написал примитивную программу на С++, которая просто ищет определенные файлы на дисках системы, написал, откомпилил, заработало. Но как то странно комп стал притормаживать, посмотрев в диспечере задач, оказалась что моя программа жрет 1,5 гигабайта(!) файла подкачки...
    Можно как нить её урезать в этом? а то работа на компе становиться невыносимой. Что можно сделать в этом случае?
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    ring4
    Сказанного явно недостаточно для точного ответа. Получишь кучу гипотез. Привел бы сорец.
    Один совет - урежь размер файла подкачки.
     
  3. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Предлагаю освобождать выделяемую память :)
     
  4. ring4

    ring4 New Member

    Публикаций:
    0
    Регистрация:
    19 ноя 2006
    Сообщения:
    279
    Вот даже такая структура даёт бешенный скачек в памяти:
    Код (Text):
    1. int WINAPI WinMain(HINSTANCE, HINSTANCE, PTSTR, int)
    2. {
    3. for (;;)
    4.     {
    5. // Вводим строки логических дисков
    6. char buf[] = {'D', 'E', 'F', 'G', 'H', 'S', 'J', 'K', 'L', 'M', 'N', 'W', 'Y', 'X','I','V'};
    7.    
    8.  
    9. // Осуществляем поиск по дискам на наличие файла
    10.     WIN32_FIND_DATA FindFileData;
    11.     HANDLE hf;
    12.     for (int i = 0; buf[i]; i++)
    13.     {
    14.        
    15.         ///////////////////////////////
    16.         string dis;
    17.         dis = buf[i];
    18.         string path = ":\\test.txt";
    19.         string s1 = dis + path;
    20.         //////////////////////////////
    21.    
    22.  
    23.     hf=FindFirstFileA(s1.c_str(), &FindFileData);
    24.  
    25.     if (INVALID_HANDLE_VALUE!=hf){
    26. //ОК
    27.  
    28.     }
    29.    
    30.     }
    31.     }
    32. }
    Даже если убрать бесконечный цикл, все равно не поможет.
    Пробывал в системе уменьшить файл подкачки, все равно, программа жрёт все что доступно.
     
  5. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    ring4
    Похоже система делает prefetch files, а поскольку ты шаришь по всему диапазону логических дисков, то все предварительное чтение сливается в файл подкачки.
     
  6. Tilir

    Tilir New Member

    Публикаций:
    0
    Регистрация:
    21 мар 2007
    Сообщения:
    4
    На ваш вопрос есть два ответа - простой и правильный.

    Простой ответ - читаем Рихтера и помещаем программу в Job, на который выставляем ограничения по памяти (Max commit limit for job / for process).

    Правильный ответ - читаем MSDN, забиваем на FindFirstFile/FindNextFile и юзаем indexing service. Там даже примеры есть, например AdvQuery.
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    А если он отключен?
     
  8. ring4

    ring4 New Member

    Публикаций:
    0
    Регистрация:
    19 ноя 2006
    Сообщения:
    279
    Все. Определил какая структура вешает систему, хотя не до конца понял почему, может вы разясните.
    Код (Text):
    1. string buf[] = {"\\\\.\\D:", "\\\\.\\E:", "\\\\.\\F:", "\\\\.\\G:", "\\\\.\\H:", "\\\\.\\S:", "\\\\.\\J:", "\\\\.\\K:", "\\\\.\\L:"};
    2. for (int i = 0; buf[i]; i++)
    3. {
    4. string ppp;
    5. ppp = buf[i]; // <- вот то злополучное место, если его закоментировать, то все путем
    6. }
    помоему вся беда в том что массив обявлен как string, хотя ничем другим обявить неполучается.
     
  9. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    ring4
    если, честно, мне уже просто смешно.. только без обид )

    ps: FindClose в этом своем
    точно не забыл?
     
  10. ring4

    ring4 New Member

    Публикаций:
    0
    Регистрация:
    19 ноя 2006
    Сообщения:
    279
    Nouzui
    да закрытие есть, ибо утечку ресерсов не избежать. Хотя я уже разобрался в своей проблеме. проблема в for в условии выхода
    если поставить for (int i = 0; i < sizeof(buf)/sizeof(string) ; i++) то все работает.
    Тема закрыта.
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582

    мда ))
     
  12. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    в первом коде было char buf[]