Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 5.00
Gepar
1181 / 537 / 77
Регистрация: 01.07.2009
Сообщений: 3,517
#1

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

14.12.2012, 02:50. Просмотров 2692. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2012, 02:50
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Максимально эфективное бинарное чтение из файла под Windows (C++):

Бинарное чтение файла
FILE *ftm; ftm = _wfopen(fff, L"r+"); //fff - это переменная wchar_t...

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

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

Чтение файла под WATCOM
Всем добрый день! Стоит задача чтения информации из файла. Есть простой код: ...

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

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

40
MrGluck
Модератор
Эксперт CЭксперт С++
8022 / 4865 / 1425
Регистрация: 29.11.2010
Сообщений: 13,251
14.12.2012, 02:55 #2
Gepar, а проход до конца файла и копирование всего блока текста не подойдет?
0
Vourhey
Почетный модератор
6490 / 2264 / 187
Регистрация: 29.07.2006
Сообщений: 12,534
14.12.2012, 02:56 #3
Gepar, тебе нужно максимально быстро считать 4 кила? Ты прикалываешься?
0
Gepar
1181 / 537 / 77
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2012, 03:01  [ТС] #4
Пока решил использовать с++ вариант, но я очень сомневаюсь в его максимально высокой скорости работы с этой иерархией наследования и вообще с кучей всего довешенного к потокам лишнего для моей задачи.
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
14.12.2012, 03:01 #5
На мой взгляд проще всего считать порциями по 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
1181 / 537 / 77
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2012, 03:02  [ТС] #6
MrGluck, ну цель = максимально быстро читать, зачем мне проход к концу файла я вообще не понял ...
0
Vourhey
Почетный модератор
6490 / 2264 / 187
Регистрация: 29.07.2006
Сообщений: 12,534
14.12.2012, 03:02 #7
Gepar, если все лишнее, то че ты апи системное не заюзаешь? Жесть какая-то. Если у тебя файл 4 кила, то разницы в скорости не заметишь, даже если по байтам его читать будешь. А если он больше, то я не понимаю, что ты такой скромный? У тебя на системе 16 метров памяти что ли стоит? Читай адекватные буфферы, а не по 4 кила, как мышь...
0
-=ЮрА=-
Заблокирован
Автор FAQ
14.12.2012, 03:03 #8
Также думаю очевидно что чтение файла должно происходить в цикле
0
Vourhey
Почетный модератор
6490 / 2264 / 187
Регистрация: 29.07.2006
Сообщений: 12,534
14.12.2012, 03:03 #9
Цитата Сообщение от Gepar Посмотреть сообщение
После того как я считаю 4 кб я (возможно) считаю ещё 2 гб по 4 кб
Извращение.
0
-=ЮрА=-
14.12.2012, 03:04
  #10

Не по теме:

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

0
MrGluck
Модератор
Эксперт CЭксперт С++
8022 / 4865 / 1425
Регистрация: 29.11.2010
Сообщений: 13,251
14.12.2012, 03:07 #11
Gepar, имею ввиду взять и скопировать весь текст в блок памяти, предварительно узнав размер блока.
И потоки точно медленнее функций т.к. за безопасность надо платить. Тот же printf быстрее cout, с чтением из файла аналогично.
0
Vourhey
Почетный модератор
6490 / 2264 / 187
Регистрация: 29.07.2006
Сообщений: 12,534
14.12.2012, 03:08 #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
максимальная производительность HDD i/o наблюдается при размерах буффера около 4 кБ. Т.е лучше всего(быстрей всего) файл в 1 Гб читать буффером по 4 кБ не больше и не меньше.
Это неправда.
0
Gepar
1181 / 537 / 77
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2012, 03:09  [ТС] #13
-=ЮрА=-, блин, твой пример заработал, хотя мой не работал. Правда это помогло тем что я понял почему у меня не читало - я буфер недостаточный выделял потому что затупил вот оно увидев что моего буфера нехватало и не читало (хотя странное поведение, я ожидал что если бы буфера не хватало то я получал бы выход за граници массива и в итоге ошибку при обращении к чужой памяти). Большое спасибо
0
MrGluck
14.12.2012, 03:11
  #14

Не по теме:

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

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

Не по теме:

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

0
Gepar
1181 / 537 / 77
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2012, 03:12  [ТС] #17
MrGluck, ну блин, предлагаешь сразу хапонуть 2 гб в оперативе, пошифровать их там (использовав ещё + 100 мб) и потом записать?
0
MrGluck
Модератор
Эксперт CЭксперт С++
8022 / 4865 / 1425
Регистрация: 29.11.2010
Сообщений: 13,251
14.12.2012, 03:13 #18
Gepar, 4 Гб оперативки нынче стоит 700р.
0
-=ЮрА=-
Заблокирован
Автор FAQ
14.12.2012, 03:16 #19
Цитата Сообщение от Vourhey Посмотреть сообщение
Это неправда.
Vourhey я продаю за что купил(тобишь данные интернет ресурса, не провернные)Кстати где то лежит статья что большие файлы около 2 или 4 Кб лучше буффер. А по хорошему проверяь надо но мне лично жаль времени на такое дело.

редлагаешь сразу хапонуть 2 гб в оперативе, пошифровать их там (использовав ещё + 100 мб) и потом записать?
- тоже самое постом выше предлагал. Именно так
0
Миниатюры
Максимально эфективное бинарное чтение из файла под Windows  
Вложения
Тип файла: pdf zdrt76.htm.pdf (106.2 Кб, 5 просмотров)
Gepar
1181 / 537 / 77
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2012, 03:18  [ТС] #20
Цитата Сообщение от MrGluck Посмотреть сообщение
Gepar, 4 Гб оперативки нынче стоит 700р.
так не себе же пишу.
0
14.12.2012, 03:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2012, 03:18
Привет! Вот еще темы с решениями:

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

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

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

Чтение загрузочного сектора под Windows
Требуется считать загрузочный сектор с диска (fdd,hdd,flash,cd) при чтении с...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru