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

Быстрое считывание 32кб из файла 7гб - C++

Восстановить пароль Регистрация
 
Dmitry877
0 / 0 / 0
Регистрация: 17.11.2015
Сообщений: 5
17.11.2015, 11:05     Быстрое считывание 32кб из файла 7гб #1
Есть бинарный файл размером 6,95 ГБ, он представляет из себя массив short. Необходимо быстро считать случайные 65536 шортов. Т.к. весь файл целиком не нужен, помещать его в оперативную память не рационально, да и физически не возможно (По требованиям программа должна запускаться на компьютере с 4гб ОЗУ и одним HDD.) . На текущий момент использую в цикле seek и read, примерное время выходит 15 секунд, что на порядок выше допустимого. Какие есть варианты ускорения этого процесса?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.11.2015, 11:05     Быстрое считывание 32кб из файла 7гб
Посмотрите здесь:

быстрое чтение массива из файла C++
C++ Считывание из файла
Быстрое чтение файла C++
считывание из файла C++
Быстрое считывание последовательности пар C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Renji
1534 / 982 / 240
Регистрация: 05.06.2014
Сообщений: 2,958
17.11.2015, 11:15     Быстрое считывание 32кб из файла 7гб #2
1) Предварительно упорядочить 65536 шортов по возрастанию смещения от начала файла. Перетасовать уже после чтения. По идее, должно несколько снизить время работы с диском.
2) Хранить в начале файла табличку на 65536 элементов, содержащую данные "сколько раз этот шорт встречается в файле". 65536 шортов не читать, а генерировать на основе таблички (чем чаще встречается, тем выше шанс генерации).
3) Менять диск на SSD.
askurandrio
21 / 54 / 12
Регистрация: 23.03.2015
Сообщений: 219
Завершенные тесты: 1
17.11.2015, 11:35     Быстрое считывание 32кб из файла 7гб #3
3) Менять диск на SSD.
Кликните здесь для просмотра всего текста
И поменять SATA на PCI-E)
Dmitry877
0 / 0 / 0
Регистрация: 17.11.2015
Сообщений: 5
17.11.2015, 11:35  [ТС]     Быстрое считывание 32кб из файла 7гб #4
Спасибо за совет, первый вариант весьма интересен, попробую его реализовать. SSD, к сожалению, не допускается по т.з. к проекту
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
17.11.2015, 12:40     Быстрое считывание 32кб из файла 7гб #5
Цитата Сообщение от Dmitry877 Посмотреть сообщение
Какие есть варианты ускорения этого процесса?
Если по заданию необходимо делать именно так как ты написал, то нет некаких вариантов.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
17.11.2015, 12:47     Быстрое считывание 32кб из файла 7гб #6
Dmitry877, предварительно построить указатели на все случайные шорты. Упорядочить их так, что бы не пришлось дважды обращаться к одной и той же виртуальной странице. Т.е. если два обращения ссылаются на одну виртуальную страницу вызывать их вместе.
Думаю это должно немного помочь.
alexvikt
12 / 12 / 5
Регистрация: 29.09.2015
Сообщений: 38
17.11.2015, 13:32     Быстрое считывание 32кб из файла 7гб #7
Ускорить можно только одним способом уменьшить число обращений к диску и исключить случайные обращения, делать только последовательное чтение. Соответственно сортировка обязательна. Дальше определиться какой максимальный буфер мы можем выделить для чтения. Допустим если у нас много элементов попадает в 1 последовательный мегабайт, и у нас есть место считать его, то лучше его загрузить в буфер и уже из него считать элементы чем за каждым обращаться к диску.
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
17.11.2015, 13:42     Быстрое считывание 32кб из файла 7гб #8
Помимо сортировки доступа, в ОС Windows можно попробовать спроецировать файл. Не знаю как с этим обстоят дела в других ОС...
warhast
7 / 7 / 3
Регистрация: 02.02.2014
Сообщений: 50
17.11.2015, 16:00     Быстрое считывание 32кб из файла 7гб #9
В худшем случае речь идет о 32к операций ввода-вывода (если данные о файлы в ОС уже закешированы), для ssd - ерунда, а вот обычным дискам этого может хватить на минуты работы. Вывод - полноценное решение скорее всего на более высоком уровне, чем простая оптимизация доступа к диску.
Dmitry877
0 / 0 / 0
Регистрация: 17.11.2015
Сообщений: 5
17.11.2015, 19:50  [ТС]     Быстрое считывание 32кб из файла 7гб #10
Оптимизировал алгоритм добавив кеширование, теперь на каждом шаге приходится считывать 170-200 шортов. Сортировка порядка почти не изменила результат. Среднее считывание теперь занимает ~200мс, но скачет от 130 до 400. Для моей задачи этого хватает.
Если я сделаю считывание в 2 потока, ускорит ли это процесс?
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
17.11.2015, 19:56     Быстрое считывание 32кб из файла 7гб #11
Цитата Сообщение от Dmitry877 Посмотреть сообщение
Если я сделаю считывание в 2 потока, ускорит ли это процесс?
Нет.

Цитата Сообщение от Dmitry877 Посмотреть сообщение
Сортировка порядка почти не изменила результат.
Либо мало читаешь, либо неправильно.

Цитата Сообщение от Dmitry877 Посмотреть сообщение
Оптимизировал алгоритм добавив кеширование
Даже интересно, каким образом?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2015, 20:11     Быстрое считывание 32кб из файла 7гб
Еще ссылки по теме:

Быстрое создание пустого файла определенного размера C++
C++ Быстрое преобразование фурье wave файла
C++ Быстрое создание бинарного файла заданного размера

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

Или воспользуйтесь поиском по форуму:
Dmitry877
0 / 0 / 0
Регистрация: 17.11.2015
Сообщений: 5
17.11.2015, 20:11  [ТС]     Быстрое считывание 32кб из файла 7гб #12
Идею я понял и реализовал. Шорты считываются по порядку их нахождения в файле. Счетчик времени скачет и прирост сложно оценить, но на глаз он если и есть то незначительный. Отрицательных сиков точно нет.
Задача такова что строится 12-уровневое дерево. У каждой ветки разное количество уровней (вложенных веток). Чем короче ветка, тем реже обновляется информация по нее (добавляются/удаляются уровни). Но даже самые длинные ветки обновляются раз в несколько секунд. Выходит что фактически мне нужно обновлять не так и много веток. Запрос к файлу теперь делается только для новых веток.
Yandex
Объявления
17.11.2015, 20:11     Быстрое считывание 32кб из файла 7гб
Ответ Создать тему
Опции темы

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