|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
14.07.2020, 01:39 | #1 |
Пользователь
Регистрация: 26.02.2011
Сообщений: 12
|
Как эффективнее обрабатывать большой файл по кускам?
Есть файл во много раз больший оперативной памяти. Собираюсь реализовать алгоритм, который загружает часть файла, помещающуюся в оперативную память и там обрабатывает. Как сделать это с максимальной эффективностью по времени на C++ под Windows? Mapping файла на оперативную память? Если так. То как определить размер куска, который поместится в оперативную память?
Последний раз редактировалось ccccfr; 14.07.2020 в 07:23. |
14.07.2020, 12:25 | #2 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,333
|
Читайте файл кусками, кратными 256К и без буферизации (FILE_FLAG_NO_BUFFERING) и в память, которая закреплена в памяти (не подкачивается).
|
15.07.2020, 17:45 | #3 | |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
Цитата:
Mapping файла не имеет смысла, если между частями не нужна синхронизация, т.е. они не должны обмениваться данными. В общем случае я бы сделал такой алго: 1. GetProcessAffinityMask() - получили кол-во ядер CPU. 2. Умножить пункт 1 на 2.. 3. CreateThread() - создать кол-во потоков по результату пункта 2. 4. GetFileSizeEx() - узнать размер файла. 5. Разделить размер файла на кол-во тредов из пункта 3. 6. В каждом потоке Thread выставить указатель на чтение SetFilePointerEx() кратное пункту 5. 7. Все потоки обрабатывают свою часть данных.
Нашедшего выход - затаптывают первым..
|
|
24.07.2020, 15:52 | #4 | |
Форумчанин
Регистрация: 26.08.2010
Сообщений: 121
|
Цитата:
|
|
24.07.2020, 20:27 | #5 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
а почему нельзя?
пункт 6 как раз и делит файл на потоки.
Нашедшего выход - затаптывают первым..
|
24.07.2020, 21:22 | #6 | ||
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Цитата:
На практике такое делать не стали хотя технология и проработана и вроде как в SAS дисках использовалась. Можно, будет медленнее чем однопоточное чтение. Так как головка будет постоянно перепозироваться. Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
||
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как в Eclipse протестировать код по кускам | RAFA91 | Общие вопросы по Java, Java SE, Kotlin | 5 | 15.05.2016 14:47 |
Большой файл с функциями | Jleksern | PHP | 7 | 12.12.2014 12:19 |
Большой текстовый файл | D_E_N | Общие вопросы Delphi | 48 | 21.11.2013 20:26 |
Не заливается на ФТП большой файл | ramzes777 | Работа с сетью в Delphi | 3 | 26.10.2011 10:19 |
отдавать большой файл с фтп | TaTT DoGG | PHP | 5 | 03.07.2009 10:34 |