Russian Qt Forum

Qt => Общие вопросы => Тема начата: Zmey от Октябрь 18, 2004, 14:32



Название: Подскажите как это ускорить
Отправлено: Zmey от Октябрь 18, 2004, 14:32
Есть двоичный файл, в котором есть 2 млн. записей вида:
  Size: unsigned 32-bit;
  LastWriteTime: unsigned 64-bit;
  Len: unsigned 16-bit;
  TypeR: unsigned 8-bit;
  Name: строка длины Len

Вот я и делаю:
Код:

QFile file( "file.bin" );
file.open( IO_ReadOnly )
QDataStream stream( &file );

struct stnameAllFiles {
Q_UINT32 dwFileSize;
Q_UINT64 qwLastTime;
Q_UINT16 wNameLenght;
Q_UINT8 iTypeRecord;
char Record[256];
} stAllFiles;

for (i=0;i<2000000;i++)
{
stream >> stAllFiles.dwFileSize;
stream >> stAllFiles.qwLastTime;
stream >> stAllFiles.wNameLenght;
stream >> stAllFiles.iTypeRecord;
stream.readRawBytes(stAllFiles.Record,stAllFiles.wNameLenght);
}

И этот перебор у меня занимает несколько минут. Эту же операцию делает чувак на Делфи и у него это работает 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?