C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Скоростное считывание файла  (Прочитано 6388 раз)
1daan1
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 11


Скоростное считывание файла
« : 28 Январь 2009, 11:55:39 »

Имеется код для создания файла:
Код:
  AnsiString fn=Edit1->Text;
  TDateTime t;
  int buf[4096];
  for (int i=0;i     buf[i]=0x33323130;
  FILE *F=fopen(fn.c_str(),"w");
  t=Now();
  for (int i=0;i     fwrite(&buf,sizeof(buf),1,F);
  t=Now()-t;
  fclose(F);
  Label1->Caption=FormatDateTime("hh:mm:ss.zzz",t);

и для считывания файла:
Код:
  AnsiString fn=Edit1->Text;
  TDateTime t;
  int buf[4096];
  FILE *F=fopen(fn.c_str(),"r");
  t=Now();
  for (int i=0;i   {
    fread(&buf,sizeof(buf),1,F);
    //тут должна быть обработка данных, проверка на выход за пределы файла, и т.п. но на первом этапе здесь ничего нет
  }
  t=Now()-t;
  fclose(F);
  Label1->Caption=FormatDateTime("hh:mm:ss.zzz",t);

Первый пример создаёт файл размером 1ГБ и забивает его символами "0123". Второй читает этот файл. Считывание занимает около 40 секунд.
Но:
Total Commander считает md5-сумму этого файла (т.е. считывает этот файл) за 16 секунд.
Что можно сделать для ускорения процесса считывания?
Builder 6, WinXPsp2.
Заранее благодарен.
Записан
Zor
Глобальный модератор


Сказали спасибо: +158/-30
Offline

Сообщений: 2946


Re: Скоростное считывание файла
« Ответ #1 : 28 Январь 2009, 12:30:04 »

буфер покрупнее сделай. несколько мегов, например. (только не в стеке  )
Записан
1daan1
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 11


Re: Скоростное считывание файла
« Ответ #2 : 03 Февраль 2009, 17:49:43 »

Код:
  int sz=262144*16;   //буфер 16М
  int *buf=new int[sz];
  FILE *F=fopen(fn.c_str(),"r");
  for (int i=0;i     fread(buf,sz*sizeof(int),1,F);
  fclose(F);
  delete[] buf;
Так стало еще медленей, теперь файл считывается больше минуты.
Может нужно использовать какую-нибудь другую функцию?
Записан
oxotnik
Глобальный модератор


Сказали спасибо: +100/-15
Offline

Сообщений: 2425


Re: Скоростное считывание файла
« Ответ #3 : 03 Февраль 2009, 18:03:17 »

а через TFileStream не проще будет?
Записан
1daan1
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 11


Re: Скоростное считывание файла
« Ответ #4 : 03 Февраль 2009, 20:15:05 »

Проще, и даже немножко быстрее (38 секунд), но все равно не то.
Заметил, что на 1М-буфере считывание происходит заметно быстрее, нежели на 16М.
Записан
Zor
Глобальный модератор


Сказали спасибо: +158/-30
Offline

Сообщений: 2946


Re: Скоростное считывание файла
« Ответ #5 : 03 Февраль 2009, 21:13:41 »

ну раз при 16Мб бруске тормозит - значит уже в систему упирается.
Прогони 2-3 раза - вторая и следующие операции считывания должны пойти сильно шустрее.
Кстати, памяти на компе сколько?

И почему не пользуетесь стандартными open/read/write/close?
// хотя догадываюсь - "нас так учили!" 


Записан
1daan1
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 11


Re: Скоростное считывание файла
« Ответ #6 : 04 Февраль 2009, 11:45:39 »

Возможно при 16М упирается в кеш винта. RAM - 2.5 GB, CPU - C2D E6400, HDD - Samsung SP2504C (250 GB SATA). При считывании индикатор активности жесткого диска светится непрерывно, загрузка процессора - пару процентов, да и то, фоновыми процессами.
Следующие операции чтения действительно проходят быстрее (от 6 до 1 секунды, в зависимости от метода чтения), но что-то я сильно сомневаюсь, чтобы мой винт выдавал больше 100 МБ/с. Конечно, 1 ГБ/с с винта было бы неплохо, но так не бывает, во всяком случае пока. Да и программе нужно будет считывать разные файлы, а не один и тот же подряд.

Относительн "нас так учили" - таки да. В свое время я перепробовал разные методы работы с файлом, и остановился на fopen/fread/fwrite/fclose для бинарных и TStringList::LoadFromFile... для текстовых. Хотя для интереса попробовал - read действительно шустрее fread, но на 1 секунду на фоне 32, т.е. незначительно.

BTW: Total Commander считает md5-сумму за 16-17 секунд и во второй, и в третий раз..
Записан
AVC
Администратор


Сказали спасибо: +28/-6
Offline

Сообщений: 1189


Re: Скоростное считывание файла
« Ответ #7 : 04 Февраль 2009, 13:20:36 »

> FILE *F=fopen(fn.c_str(),"r");
попробуйте rb
Записан
1daan1
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 11


Re: Скоростное считывание файла
« Ответ #8 : 04 Февраль 2009, 14:22:23 »

Пробовал, разницы нет. Очевидно, у меня _fmode равняется O_BINARY по умолчанию.
Записан
Zor
Глобальный модератор


Сказали спасибо: +158/-30
Offline

Сообщений: 2946


Re: Скоростное считывание файла
« Ответ #9 : 04 Февраль 2009, 15:16:10 »

Total Commander кстати часто использует свои собственные методы в обход системы.
так что делайте дальше - тут вам уже не ускорить.
Записан
Lexa F.
Участник


Сказали спасибо: +23/-3
Offline

Сообщений: 455


Re: Скоростное считывание файла
« Ответ #10 : 07 Август 2010, 10:24:13 »

Ребят, такой вопрос.

Имеется файл (не менее 1000 строк). Нужно считать последнюю строку из него. Через TStringList думаю не рентабельно. Как это сделать с помощью fopen (только не через цикл, может метод какой есть?)

И вообще подскажите наибыстрейший вариант.
Записан
Zor
Глобальный модератор


Сказали спасибо: +158/-30
Offline

Сообщений: 2946


Re: Скоростное считывание файла
« Ответ #11 : 07 Август 2010, 13:21:54 »

Именно через TStringList. Вы будете ну очень сильно извращатся но быстрее сделаете врядли.
Тем более что такого в 1000 строках текста? Это все таки не 100M строк.

Записан
Lexa F.
Участник


Сказали спасибо: +23/-3
Offline

Сообщений: 455


Re: Скоростное считывание файла
« Ответ #12 : 07 Август 2010, 13:49:41 »

Zor, спасибо. Убедили!
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Скоростное считывание файла
« Ответ #13 : 08 Август 2010, 10:56:55 »

Но если в файле все строки одинакового размера и этот размер известен заранее, то "рентабельнее", возможно, будет и через fopen/fgets. Перемещаемся на позицию n*(m-1), где n - размер строки, m - количество строк, и потом берем строку по размеру n.
PS. 1000 строк - это конечно не размер...
Записан
Jenia
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 10


« Ответ #14 : 10 Август 2010, 15:40:08 »

можно ведь смотреть файл с конца это будет все равно быстрее
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.084 секунд. Запросов: 19.