C++Builder
Начало
Форум
Помощь
Войти
Регистрация
C++Builder
>
Forum
>
Вопросы программирования
>
Общие вопросы программирования в C++Builder
>
Скоростное считывание файла
Страниц: [
1
]
Вниз
Печать
Автор
Тема: Скоростное считывание файла (Прочитано 6348 раз)
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
Re: Скоростное считывание файла
«
Ответ #14 :
10 Август 2010, 15:40:08 »
можно ведь смотреть файл с конца это будет все равно быстрее
Записан
Страниц: [
1
]
Вверх
Печать
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Вопросы программирования
-----------------------------
=> Общие вопросы программирования в C++Builder
=> Программирование с FMX
=> Работа с базами данных в C++Builder
=> Windows API
=> Технологии COM/DCOM, ActiveX
=> Аспекты и идеология профессиональной разработки ПО
=> Компьютерное железо и системное администрирование
=> студенческий городок
-----------------------------
Обсуждение материалов на сайте
-----------------------------
=> Обсуждений статей на сайте
=> Обсуждение материалов из файлового архива
=> Компоненты сторонних разработчиков к С++Builder
-----------------------------
Работа сайта и новости
-----------------------------
=> Ищу/предлагаю работу
=> Новости из мира программирования
=> Новости - события календаря
=> Голосования
=> Компьютерный юмор и приколы
=> Работа сайта
=> Флейм
-----------------------------
FAQ - частозадаваемые вопросы/ответы
-----------------------------
=> FAQ, общие вопросы, посвящённые C++Builder
=> FAQ, вопросы по базам данных
=> FAQ, вопросы по компонентам
Загружается...