как быстро искать?

Тема в разделе "WASM.A&O", создана пользователем Stariy, 12 сен 2007.

  1. Stariy

    Stariy Member

    Публикаций:
    0
    Регистрация:
    22 окт 2003
    Сообщения:
    529
    Адрес:
    Russia
    дано: большой файл,ну допустим -200 ГБ. Ожидается, что файл заполнен нулями,но это может быть и не так,возможны вкрапления других байт.
    необходимо пробежаться по файлу и если найдутся ненулевые байты -вывести смещения,по которым они находятся. с максимальной скоростью, в идеале скорость должна ограничиваться лишь физическими параметрами жесткого диска.
    как делаю я: делаю буфер на 10 мб,в цикле считываю в него кусочек и побайтно сравниваю с 0.
     
  2. Stariy

    Stariy Member

    Публикаций:
    0
    Регистрация:
    22 окт 2003
    Сообщения:
    529
    Адрес:
    Russia
    можно ли ускорить процесс?
     
  3. nermest

    nermest New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    157
    Может имеет смысл использовать асинхронный режим чтения?
    То есть ты считываешь 10мб в асинхронном режиме,
    а когда буффер проверки заканчивается, ждать данных уже не надо.
     
  4. Stariy

    Stariy Member

    Публикаций:
    0
    Регистрация:
    22 окт 2003
    Сообщения:
    529
    Адрес:
    Russia
    не понял че-то, можно малость подробней, почему не надо ждать? кэш?
     
  5. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    1. Двордами сравнивать, если где-то не ноль, то уже по байтам.
    2. Без кеширования.
    3. Через порт завершения.
     
  6. Stariy

    Stariy Member

    Публикаций:
    0
    Регистрация:
    22 окт 2003
    Сообщения:
    529
    Адрес:
    Russia
    насчет 1 я уже думал, завтра сравню, насколько быстрей выходит. А вот "3" -че за порт такой?
     
  7. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
  8. wasm_test

    wasm_test wasm test user

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

    Stariy Member

    Публикаций:
    0
    Регистрация:
    22 окт 2003
    Сообщения:
    529
    Адрес:
    Russia
    еще интересно,что произойдет,если попытаться отобразить файл в память... как только до компа доберусь -обязательно попробую
     
  10. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    (c) MSDN
     
  11. Stariy

    Stariy Member

    Публикаций:
    0
    Регистрация:
    22 окт 2003
    Сообщения:
    529
    Адрес:
    Russia
    да-да,так оно и есть. пробовал двордами сравнивать -прироста скорости не заметил:-(
     
  12. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Потому что, как и с байтами скорость определяется загрузкой данных с диска,
    а это - ацки медленно, потому и не очень заметно :)
     
  13. nermest

    nermest New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    157
    Асинхронный режим - это когда мы делаем "заказ" на данные, но управление возвращается после регистрации заказа, а не после его выполнения. Извещение о завершении приходит в виде какого-нибудь сообщения или сигнала.
    Например, есть у нас 2 буффера. Мы каждый раз заказываем данные в один буффер, а в другом они уже должны лежать.
    Код (Text):
    1. buffer[2];
    2. i=0;
    3. read_buffer_async(message, buffer[i]);
    4. while(all_data_to_read){
    5.   wait_for_message(message);
    6.   //are able for using buffer[i]
    7.   read_buffer_async(message, buffer[i xor 1]);
    8.   //ordered data to buffer[i xor 1];
    9.   //
    10.   //...using data in buffer[i]
    11.   //
    12.   i = i xor 1;
    13. }
    Смысл в том, что пока мы используем заполненный буффер, система в это время заполняет другой.
     
  14. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Двумя тут врятли обойтись - какой размер не бери, мы всё равно первый обработаем быстрее,
    чем подгрузиться второй, а делать больше буферов... хз
     
  15. nermest

    nermest New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    157
    Да понятно, я ж не конечное решение представил. Можно считать это псевдокодом псевдорешения:)
     
  16. alexandr_k

    alexandr_k New Member

    Публикаций:
    0
    Регистрация:
    30 авг 2007
    Сообщения:
    26
    делать больше буферов толку 0, всеравно первый освободиться раньше чем второй будет готов к использованию.
    т.е. след после второго буфера целесообразнее считывать первый
    можно баловаться с их размерами... кратность например привязать правильную... и т.д.
    и читать ессно в отдельном потоке.
     
  17. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.243
    alexandr_k, верно отметил насчёт кратности в принцепи буфер может быть один и обрабатываться двумя потоками: один поток считывает в буфер, а другой сравнивает. ну, и, конечно, крит. секции юзать надо, чтобы коллизии не было. лучшего придумать уже нельзя.