Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517

Максимально эфективное бинарное чтение из файла под Windows

14.12.2012, 02:50. Показов 6057. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача: максимально эфективно (быстро) читать данные из файла. Каким это будет происходить образом - в виде си функции, с++ или винапи функции не имеет значения, имеет значение лишь результат.
Как мне известно размер странички в Windows = 4Кб так что быстрее всего по идее чтение должно происходить если читать по 4 кб, но как лучше всего это сделать?

Вообще в итоге я буду использоать 64битные значения после того как считаю кусок файла. Вот мой маленький набросок, который првда закончился фиаско потому что стандартная fread, как оказалось, имеет буфер под чтение меньше 4 кб так что нужно что-то другое быстрое
C++
1
2
3
4
5
6
7
    FILE* readFrom = fopen("input.bin","rb"); _ASSERT(readFrom);
    uint64_t bufferRead[64];//мой буффер на 4 кб
    size_t countBlocks;//считано блоков
 
        // вернёт 0 потому что fread не может считать 4096 байтиков
    countBlocks = fread(bufferRead,1,4096,readFrom);
    fclose(readFrom);
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.12.2012, 02:50
Ответы с готовыми решениями:

Бинарное чтение файла
<?php @error_reporting ( E_ALL ); @ini_set ( 'display_errors', true ); @ini_set ( 'html_errors', false ); @ini_set (...

Бинарное чтение файла
Что за каракули в конце файла,? Спасибо.

Бинарное чтение из файла
Всем доброго времени суток. Столкнулся с проблемой чтения из файла в бинарном режиме. У меня есть исполнительный файл программы для...

40
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
14.12.2012, 02:55
Gepar, а проход до конца файла и копирование всего блока текста не подойдет?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
14.12.2012, 02:56
Gepar, тебе нужно максимально быстро считать 4 кила? Ты прикалываешься?
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2012, 03:01  [ТС]
Пока решил использовать с++ вариант, но я очень сомневаюсь в его максимально высокой скорости работы с этой иерархией наследования и вообще с кучей всего довешенного к потокам лишнего для моей задачи.
C++
1
2
3
4
5
6
    ifstream ifile("input.bin",ifstream::binary | ifstream::in);
    uint64_t bufferRead[64];
    size_t countBlocks;
 
    ifile.read((char*)bufferRead,4096);
    countBlocks = ifile.gcount();
Добавлено через 48 секунд
Цитата Сообщение от Vourhey Посмотреть сообщение
Gepar, тебе нужно максимально быстро считать 4 кила? Ты прикалываешься?
Нет, мне нужно максимально быстро читать блоки по 4 кб поэтому каждая операция должна быть очень быстрой. После того как я считаю 4 кб я (возможно) считаю ещё 2 гб по 4 кб.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
14.12.2012, 03:01
На мой взгляд проще всего считать порциями по 4 кб вот так
C
1
2
3
FILE * file = fopen("binary.bin", "rb");
void * lpBuf = malloc(4*1024*sizeof(char));
fread(lpBuf, 1, 4*1024, file);//В буффер будет впихиваться до 4 кБ инфы включительно
C++
1
2
3
ifstream ifs("binary.bin", ios::binary);
char * szBuf = new char[4*1024];
ifs.read(szBuf, 4*1024);
Далее с буферком делай что хочешь.
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2012, 03:02  [ТС]
MrGluck, ну цель = максимально быстро читать, зачем мне проход к концу файла я вообще не понял ...
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
14.12.2012, 03:02
Gepar, если все лишнее, то че ты апи системное не заюзаешь? Жесть какая-то. Если у тебя файл 4 кила, то разницы в скорости не заметишь, даже если по байтам его читать будешь. А если он больше, то я не понимаю, что ты такой скромный? У тебя на системе 16 метров памяти что ли стоит? Читай адекватные буфферы, а не по 4 кила, как мышь...
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
14.12.2012, 03:03
Также думаю очевидно что чтение файла должно происходить в цикле
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
14.12.2012, 03:03
Цитата Сообщение от Gepar Посмотреть сообщение
После того как я считаю 4 кб я (возможно) считаю ещё 2 гб по 4 кб
Извращение.
0
14.12.2012, 03:04

Не по теме:

Vourhey, речь идёт не о размере файла 4 кБ а о том что максимальная производительность HDD i/o наблюдается при размерах буффера около 4 кБ. Т.е лучше всего(быстрей всего) файл в 1 Гб читать буффером по 4 кБ не больше и не меньше.

0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
14.12.2012, 03:07
Gepar, имею ввиду взять и скопировать весь текст в блок памяти, предварительно узнав размер блока.
И потоки точно медленнее функций т.к. за безопасность надо платить. Тот же printf быстрее cout, с чтением из файла аналогично.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
14.12.2012, 03:08
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
максимальная производительность HDD i/o наблюдается при размерах буффера около 4 кБ. Т.е лучше всего(быстрей всего) файл в 1 Гб читать буффером по 4 кБ не больше и не меньше.
Это неправда.
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2012, 03:09  [ТС]
-=ЮрА=-, блин, твой пример заработал, хотя мой не работал. Правда это помогло тем что я понял почему у меня не читало - я буфер недостаточный выделял потому что затупил вот оно увидев что моего буфера нехватало и не читало (хотя странное поведение, я ожидал что если бы буфера не хватало то я получал бы выход за граници массива и в итоге ошибку при обращении к чужой памяти). Большое спасибо
0
14.12.2012, 03:11

Не по теме:

У меня одного в голову сразу лезет "Понемножечку, помаленечку, По копеечке, по зёрнышку, по семечке..." ?)

0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2012, 03:11  [ТС]
Vourhey, ну проаргументируй, тема то интересная. Я слышал эту информацию от хорошего программиста поэтому поверил ему, если ты знаешь резкие аргументы против то приведи их (только не в виде личных наблюдений же). Тот кто мне дал эту подсказку проаргументировал почему, в общем-то я и написал это в начале.
0
14.12.2012, 03:11

Не по теме:

PS:Gepar, лично мне кажется целесообразней не ограничиваться производительностью головок HDD а производить обработку файла в оператвке в буффере аккурат под размер файла (благо современные планки памяти позволят чуть ли не поверхность HDD в памяти держать) и производить все операции над файлом именно в ОЗУ - будет в тысячи раз быстрей. Конечно сам я максимум держал в оперативе 300 Мб данных не более, не было необходимости держать больше

0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2012, 03:12  [ТС]
MrGluck, ну блин, предлагаешь сразу хапонуть 2 гб в оперативе, пошифровать их там (использовав ещё + 100 мб) и потом записать?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
14.12.2012, 03:13
Gepar, 4 Гб оперативки нынче стоит 700р.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
14.12.2012, 03:16
Цитата Сообщение от Vourhey Посмотреть сообщение
Это неправда.
Vourhey я продаю за что купил(тобишь данные интернет ресурса, не провернные)Кстати где то лежит статья что большие файлы около 2 или 4 Кб лучше буффер. А по хорошему проверяь надо но мне лично жаль времени на такое дело.

редлагаешь сразу хапонуть 2 гб в оперативе, пошифровать их там (использовав ещё + 100 мб) и потом записать?
- тоже самое постом выше предлагал. Именно так
Миниатюры
Максимально эфективное бинарное чтение из файла под Windows  
Вложения
Тип файла: pdf zdrt76.htm.pdf (106.2 Кб, 7 просмотров)
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2012, 03:18  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Gepar, 4 Гб оперативки нынче стоит 700р.
так не себе же пишу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.12.2012, 03:18
Помогаю со студенческими работами здесь

Бинарное чтение файла
FILE *ftm; ftm = _wfopen(fff, L"r+"); //fff - это переменная wchar_t содержащая имя файла! unsigned short buf = { 0 }; ...

Бинарное чтение файла
Всем доброго времени суток. Стоит задача реализовать зашифровать файл RSA ключом в 1024 бит. Но споткнулся с проблемой чтения файла в виде...

Максимально быстрое чтение очень большого файла
Добрый день, задача прочитать очень большой файл (1GB-10GB+). Нужно провести операцию с каждой строкой этого файла. Используя...

Бинарное чтение из файла с пoмощью функции fread()
Подскажите, пожалуйста, почему feof() может возвращать конец файла далеко до его реального конца? Конец проверяется из обозревателя файлов...

Бинарное дерево поиска. Как осуществить запись в файл и чтение из файла
Добрый день! Если кому не жаль своего времени окажите помощь! Необходимо осуществить запись в файл,просмотр содержимого файла, и создание...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru