Russian Qt Forum
Ноябрь 23, 2024, 11:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Подскажите как это ускорить  (Прочитано 15346 раз)
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
Гость
« Ответ #1 : Октябрь 18, 2004, 15:33 »

а никак

если тебе надо быстро то делай
FILE* fl;
fl=fopen();

и так далее
Записан
Sergeich
Гость
« Ответ #2 : Октябрь 19, 2004, 15:10 »

Читай файл в память кусками кратными 4K, а потом заполняй свои структуры.
Записан
Zmey
Гость
« Ответ #3 : Октябрь 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
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #4 : Октябрь 26, 2004, 07:42 »

укак раз в цикле все и не так
очень медленно все из стрима достается

поетому попоробуй с FILE и сравни скорость
Записан
Sergeich
Гость
« Ответ #5 : Октябрь 26, 2004, 14:18 »

1. QDataStream по умолчанию использует сетевой порядок байтов
(Big Endian), а в PC-шной архитектуре используется Little Endian. Поставь при записи в файл и чтении из него
yourDataStream.setByteOrder(QDataStream::LittleEndian)
2. Не читай весь файл в память сразу : физической памяти может не хватить, начнется жуткий своппинг и мало не покажется
Записан
Zmey
Гость
« Ответ #6 : Октябрь 27, 2004, 09:09 »

1. Переключение в Little Endian стоит, я не привел эту строчку дабы не забивать приведенный код.
2. Памяти много, хватает вполне.

Чё та не получается у меня через FILE  :oops: Какой функцией читать из бинарного файла? Допустим в файле записано char [20], потом 2 по unsigned 16-bit, потом unsigned 32-bit, как это вытащить из файла?..  :oops:
Записан
Zmey
Гость
« Ответ #7 : Октябрь 27, 2004, 12:59 »

Заработало! Быстро. Всем спасибо за помощь. Кстати вызов qApp->processEvents() на каждой итерации продлевает время выполнения примерно в 3 раза.
Записан
EugeneVC
Гость
« Ответ #8 : Октябрь 28, 2004, 17:48 »

зато твою прогу не убьют Улыбающийся
Записан
Zmey
Гость
« Ответ #9 : Октябрь 29, 2004, 08:18 »

Цитата: "EugeneVC"
зато твою прогу не убьют Улыбающийся


Чавой-чавой?..
Записан
EugeneVC
Гость
« Ответ #10 : Октябрь 31, 2004, 23:50 »

человек думает что твоя прога зависла
и убивает ее
Записан
Zmey
Гость
« Ответ #11 : Ноябрь 01, 2004, 09:47 »

Не, теперь я буду выполнять qApp->processEvents() на каждой 100 000-ной итерации из 2 000 000, будет видно что жива! Улыбающийся
Записан
EugeneVC
Гость
« Ответ #12 : Ноябрь 01, 2004, 10:30 »

примерно так и надо Улыбающийся
Записан
Zmey
Гость
« Ответ #13 : Ноябрь 15, 2004, 10:11 »

Перебор ускорили, теперь я каждую запись проверяю на соотвествие приведенной строке функцией bool QRegExp::exactMatch ( const QString & str ).
...Есть какой-нить более шустрый аналог QRegExp?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 23.