Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 5.00
Gepar
1180 / 536 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
#1

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

14.12.2012, 02:50. Просмотров 2551. Ответов 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++):

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

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

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

Чтение файла под WATCOM - C++
Всем добрый день! Стоит задача чтения информации из файла. Есть простой код: #include <iostream> #include <fstream> #include...

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

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

40
MrGluck
Модератор
Эксперт CЭксперт С++
7512 / 4644 / 700
Регистрация: 29.11.2010
Сообщений: 12,680
14.12.2012, 02:55 #2
Gepar, а проход до конца файла и копирование всего блока текста не подойдет?
0
Vourhey
Почетный модератор
6487 / 2261 / 123
Регистрация: 29.07.2006
Сообщений: 12,534
14.12.2012, 02:56 #3
Gepar, тебе нужно максимально быстро считать 4 кила? Ты прикалываешься?
0
Gepar
1180 / 536 / 20
Регистрация: 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
1180 / 536 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2012, 03:02  [ТС] #6
MrGluck, ну цель = максимально быстро читать, зачем мне проход к концу файла я вообще не понял ...
0
Vourhey
Почетный модератор
6487 / 2261 / 123
Регистрация: 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
Почетный модератор
6487 / 2261 / 123
Регистрация: 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Эксперт С++
7512 / 4644 / 700
Регистрация: 29.11.2010
Сообщений: 12,680
14.12.2012, 03:07 #11
Gepar, имею ввиду взять и скопировать весь текст в блок памяти, предварительно узнав размер блока.
И потоки точно медленнее функций т.к. за безопасность надо платить. Тот же printf быстрее cout, с чтением из файла аналогично.
0
Vourhey
Почетный модератор
6487 / 2261 / 123
Регистрация: 29.07.2006
Сообщений: 12,534
14.12.2012, 03:08 #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
максимальная производительность HDD i/o наблюдается при размерах буффера около 4 кБ. Т.е лучше всего(быстрей всего) файл в 1 Гб читать буффером по 4 кБ не больше и не меньше.
Это неправда.
0
Gepar
1180 / 536 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2012, 03:09  [ТС] #13
-=ЮрА=-, блин, твой пример заработал, хотя мой не работал. Правда это помогло тем что я понял почему у меня не читало - я буфер недостаточный выделял потому что затупил вот оно увидев что моего буфера нехватало и не читало (хотя странное поведение, я ожидал что если бы буфера не хватало то я получал бы выход за граници массива и в итоге ошибку при обращении к чужой памяти). Большое спасибо
0
MrGluck
14.12.2012, 03:11
  #14

Не по теме:

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

0
Gepar
1180 / 536 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
14.12.2012, 03:11  [ТС] #15
Vourhey, ну проаргументируй, тема то интересная. Я слышал эту информацию от хорошего программиста поэтому поверил ему, если ты знаешь резкие аргументы против то приведи их (только не в виде личных наблюдений же). Тот кто мне дал эту подсказку проаргументировал почему, в общем-то я и написал это в начале.
0
14.12.2012, 03:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2012, 03:11
Привет! Вот еще темы с ответами:

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

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

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

Чтение загрузочного сектора под Windows - Assembler
Требуется считать загрузочный сектор с диска (fdd,hdd,flash,cd) при чтении с флопа всё проходит нормально, но при попытке чтения с любого...


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

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

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