Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 5.00
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
14.12.2012, 02:50     Максимально эфективное бинарное чтение из файла под Windows #1
Задача: максимально эфективно (быстро) читать данные из файла. Каким это будет происходить образом - в виде си функции, с++ или винапи функции не имеет значения, имеет значение лишь результат.
Как мне известно размер странички в 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);
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2012, 02:50     Максимально эфективное бинарное чтение из файла под Windows
Посмотрите здесь:

Бинарное чтение из файла с пoмощью функции fread() C++
Бинарное считывание с файла и бинарный вывод. C++
C++ как может корректно выполняющийся оператор >> (чтение из текстового файла) негативно влиять на открытие другого файла?
Чтение из файла. Повторное чтение файла C++
Найти сумму максимально отрицательного и максимально положительного элемента массива C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
14.12.2012, 02:55     Максимально эфективное бинарное чтение из файла под Windows #2
Gepar, а проход до конца файла и копирование всего блока текста не подойдет?
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
14.12.2012, 02:56     Максимально эфективное бинарное чтение из файла под Windows #3
Gepar, тебе нужно максимально быстро считать 4 кила? Ты прикалываешься?
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
14.12.2012, 03:01  [ТС]     Максимально эфективное бинарное чтение из файла под Windows #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 кб.
-=ЮрА=-
Заблокирован
Автор FAQ
14.12.2012, 03:01     Максимально эфективное бинарное чтение из файла под Windows #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);
Далее с буферком делай что хочешь.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
14.12.2012, 03:02  [ТС]     Максимально эфективное бинарное чтение из файла под Windows #6
MrGluck, ну цель = максимально быстро читать, зачем мне проход к концу файла я вообще не понял ...
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
14.12.2012, 03:02     Максимально эфективное бинарное чтение из файла под Windows #7
Gepar, если все лишнее, то че ты апи системное не заюзаешь? Жесть какая-то. Если у тебя файл 4 кила, то разницы в скорости не заметишь, даже если по байтам его читать будешь. А если он больше, то я не понимаю, что ты такой скромный? У тебя на системе 16 метров памяти что ли стоит? Читай адекватные буфферы, а не по 4 кила, как мышь...
-=ЮрА=-
Заблокирован
Автор FAQ
14.12.2012, 03:03     Максимально эфективное бинарное чтение из файла под Windows #8
Также думаю очевидно что чтение файла должно происходить в цикле
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
14.12.2012, 03:03     Максимально эфективное бинарное чтение из файла под Windows #9
Цитата Сообщение от Gepar Посмотреть сообщение
После того как я считаю 4 кб я (возможно) считаю ещё 2 гб по 4 кб
Извращение.
-=ЮрА=-
14.12.2012, 03:04
  #10

Не по теме:

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

MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
14.12.2012, 03:07     Максимально эфективное бинарное чтение из файла под Windows #11
Gepar, имею ввиду взять и скопировать весь текст в блок памяти, предварительно узнав размер блока.
И потоки точно медленнее функций т.к. за безопасность надо платить. Тот же printf быстрее cout, с чтением из файла аналогично.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
14.12.2012, 03:08     Максимально эфективное бинарное чтение из файла под Windows #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
максимальная производительность HDD i/o наблюдается при размерах буффера около 4 кБ. Т.е лучше всего(быстрей всего) файл в 1 Гб читать буффером по 4 кБ не больше и не меньше.
Это неправда.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
14.12.2012, 03:09  [ТС]     Максимально эфективное бинарное чтение из файла под Windows #13
-=ЮрА=-, блин, твой пример заработал, хотя мой не работал. Правда это помогло тем что я понял почему у меня не читало - я буфер недостаточный выделял потому что затупил вот оно увидев что моего буфера нехватало и не читало (хотя странное поведение, я ожидал что если бы буфера не хватало то я получал бы выход за граници массива и в итоге ошибку при обращении к чужой памяти). Большое спасибо
MrGluck
14.12.2012, 03:11
  #14

Не по теме:

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

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

Не по теме:

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

Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
14.12.2012, 03:12  [ТС]     Максимально эфективное бинарное чтение из файла под Windows #17
MrGluck, ну блин, предлагаешь сразу хапонуть 2 гб в оперативе, пошифровать их там (использовав ещё + 100 мб) и потом записать?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
14.12.2012, 03:13     Максимально эфективное бинарное чтение из файла под Windows #18
Gepar, 4 Гб оперативки нынче стоит 700р.
-=ЮрА=-
Заблокирован
Автор FAQ
14.12.2012, 03:16     Максимально эфективное бинарное чтение из файла под Windows #19
Цитата Сообщение от Vourhey Посмотреть сообщение
Это неправда.
Vourhey я продаю за что купил(тобишь данные интернет ресурса, не провернные)Кстати где то лежит статья что большие файлы около 2 или 4 Кб лучше буффер. А по хорошему проверяь надо но мне лично жаль времени на такое дело.

редлагаешь сразу хапонуть 2 гб в оперативе, пошифровать их там (использовав ещё + 100 мб) и потом записать?
- тоже самое постом выше предлагал. Именно так
Миниатюры
Максимально эфективное бинарное чтение из файла под Windows  
Вложения
Тип файла: pdf zdrt76.htm.pdf (106.2 Кб, 5 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2012, 03:18     Максимально эфективное бинарное чтение из файла под Windows
Еще ссылки по теме:

Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла. C++
Соединение двух программ в одну (бинарное сложение и бинарное сравнение) C++
C++ Считать из файла целочисленный массив C[N] и сформировать из него максимально возможную матрицу А [n x n]

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

Или воспользуйтесь поиском по форуму:
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
14.12.2012, 03:18  [ТС]     Максимально эфективное бинарное чтение из файла под Windows #20
Цитата Сообщение от MrGluck Посмотреть сообщение
Gepar, 4 Гб оперативки нынче стоит 700р.
так не себе же пишу.
Yandex
Объявления
14.12.2012, 03:18     Максимально эфективное бинарное чтение из файла под Windows
Ответ Создать тему
Опции темы

Текущее время: 00:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru