Название: Подскажите как это ускорить Отправлено: Zmey от Октябрь 18, 2004, 14:32 Есть двоичный файл, в котором есть 2 млн. записей вида:
Size: unsigned 32-bit; LastWriteTime: unsigned 64-bit; Len: unsigned 16-bit; TypeR: unsigned 8-bit; Name: строка длины Len Вот я и делаю: Код:
И этот перебор у меня занимает несколько минут. Эту же операцию делает чувак на Делфи и у него это работает 10-15 секунд(!!!), то есть скорость отличается на порядки. Как это ускорить? Название: Подскажите как это ускорить Отправлено: EugeneVC от Октябрь 18, 2004, 15:33 а никак
если тебе надо быстро то делай FILE* fl; fl=fopen(); и так далее Название: Подскажите как это ускорить Отправлено: Sergeich от Октябрь 19, 2004, 15:10 Читай файл в память кусками кратными 4K, а потом заполняй свои структуры.
Название: Подскажите как это ускорить Отправлено: Zmey от Октябрь 25, 2004, 15:59 Да я весь файл загоняю в память,
file.open( IO_ReadOnly ); QBuffer buf2(file.readAll()); file.close(); buf2.open(IO_ReadOnly); QDataStream stream( &buf2 ); а потом заполняю структуры, и нифига не ускоряется. Может в самом этом цикле - for (i=0;i<2000000;i++) { stream >> stAllFiles.dwFileSize; stream >> stAllFiles.qwLastTime; stream >> stAllFiles.wNameLenght; stream >> stAllFiles.iTypeRecord; stream.readRawBytes(stAllFiles.Record,stAllFiles.wNameLenght); } что-то не так? Название: Подскажите как это ускорить Отправлено: Admin от Октябрь 26, 2004, 07:42 укак раз в цикле все и не так
очень медленно все из стрима достается поетому попоробуй с FILE и сравни скорость Название: Подскажите как это ускорить Отправлено: Sergeich от Октябрь 26, 2004, 14:18 1. QDataStream по умолчанию использует сетевой порядок байтов
(Big Endian), а в PC-шной архитектуре используется Little Endian. Поставь при записи в файл и чтении из него yourDataStream.setByteOrder(QDataStream::LittleEndian) 2. Не читай весь файл в память сразу : физической памяти может не хватить, начнется жуткий своппинг и мало не покажется Название: Подскажите как это ускорить Отправлено: Zmey от Октябрь 27, 2004, 09:09 1. Переключение в Little Endian стоит, я не привел эту строчку дабы не забивать приведенный код.
2. Памяти много, хватает вполне. Чё та не получается у меня через FILE :oops: Какой функцией читать из бинарного файла? Допустим в файле записано char [20], потом 2 по unsigned 16-bit, потом unsigned 32-bit, как это вытащить из файла?.. :oops: Название: Подскажите как это ускорить Отправлено: Zmey от Октябрь 27, 2004, 12:59 Заработало! Быстро. Всем спасибо за помощь. Кстати вызов qApp->processEvents() на каждой итерации продлевает время выполнения примерно в 3 раза.
Название: Подскажите как это ускорить Отправлено: EugeneVC от Октябрь 28, 2004, 17:48 зато твою прогу не убьют :)
Название: Подскажите как это ускорить Отправлено: Zmey от Октябрь 29, 2004, 08:18 Цитата: "EugeneVC" зато твою прогу не убьют :) Чавой-чавой?.. Название: Подскажите как это ускорить Отправлено: EugeneVC от Октябрь 31, 2004, 23:50 человек думает что твоя прога зависла
и убивает ее Название: Подскажите как это ускорить Отправлено: Zmey от Ноябрь 01, 2004, 09:47 Не, теперь я буду выполнять qApp->processEvents() на каждой 100 000-ной итерации из 2 000 000, будет видно что жива! :)
Название: Подскажите как это ускорить Отправлено: EugeneVC от Ноябрь 01, 2004, 10:30 примерно так и надо :)
Название: Подскажите как это ускорить Отправлено: Zmey от Ноябрь 15, 2004, 10:11 Перебор ускорили, теперь я каждую запись проверяю на соотвествие приведенной строке функцией bool QRegExp::exactMatch ( const QString & str ).
...Есть какой-нить более шустрый аналог QRegExp? |