6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
|
||||||
1 | ||||||
Чтение/запись в файл с использованием многопоточности06.08.2014, 01:01. Показов 15265. Ответов 38
Метки нет (Все метки)
Доброго времени суток!
Хочу решить следующую задачу: Есть большой бинарный файл (несколько гигабайт к примеру). Нужно разбить этот файл на части и записать в другой файл хэши этих частей, используя многопоточность (многопроцессорность). С ней я никогда не работал. Читал про процессы, потоки и т.д. Но никогда не использовал в программах. Предполагаю сделать так
0
|
06.08.2014, 01:01 | |
Ответы с готовыми решениями:
38
Открыть текстовый файл в необходимом режиме (на чтение, на чтение и запись, на добавление) Чтение/запись в файл Чтение и запись в файл Чтение и запись в файл |
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
07.08.2014, 12:55 | 21 |
Ну если я правильно понимаю, то это один блок.
Параллелить расчет хеша одного блока не очень просто и не понимаю зачем, ИМХО параллелить проще и лучше расчет хешей нескольких блоков. Правильно или нет - не знаю, кода в архиве не нашел. Ну судя по коду - не так, а на мой взгляд, нужно бы.
1
|
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
|
|
07.08.2014, 13:02 [ТС] | 22 |
как так? source.rar И там тоже нет кода?
Получается, мы должны сразу разбить проекцию на блоки? То есть взять какой-нибудь контейнер типа Pbyte. Расфасовать блоки в контейнер. и подать все эту циклу, который Вы привели? Тогда где тут окно? Я понимаю, когда у нас один блок и окно двигается. Размер окна - размер блока. Или в окне несколько блоков? Тогда не знаю, как это реализовать...
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
07.08.2014, 13:10 | 23 |
Окно - отмапленная область, размер его - несколько блоков, хеши которых нужно посчитать, хеш каждого блока считается в своем потоке. Тасовать ничего никуда не надо, считаем прямо на месте.
А, да, сорри, вечером посмотрю, возможно начну понимать в чем проблема . OpenMP очень удобно параллелит циклы, но только в случае, если итерации цикла независимы.
1
|
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
|
||||||
07.08.2014, 15:13 [ТС] | 24 | |||||
Перечитал Ваши посты с самого начала и понял про окно. Количество ядер, как найти я знаю. Размер окна найти труда не составит. Нужно зарезервировать пространства для окна, верно? и про контейнер я правильно сказал?
Не могли бы Вы поподробнее описать процесс от создания проекции до хэширования блоков? Буду очень признателен, если на важных участках конструкции кода приведете. Добавлено через 1 час 44 минуты Создаем окно
Я не знаю, как разбить созданное окно по блокам. У меня складывается ощущение, что это надо делать параллельно, чтобы потом передать в параллельный цикл, который Вы написали. Или нет?
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
07.08.2014, 19:33 | 25 |
Народ, я нифига не понял. Объясните мне, на кой все так усложнять?
Зачем тут нужны отображаемые в память файлы? Зачем тут нужен OpenMP? Почему бы просто-напросто не реализовать паттерн producer/consumer?
0
|
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
|
|
07.08.2014, 20:35 [ТС] | 26 |
Как я понимаю, отправляем блоки. Выдаем хэш. А многопоточность? В чем плюс producer/consumer? Прочел статью на msdn, но пользы не увидел. Что упростит?
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
07.08.2014, 20:41 | 27 |
А что с ней не так? Несколько потоков есть.
Считывание данных выполняется параллельно с их обработкой. Реализацию упростит. Зачем там нужны отображаемые в память файлы и OpenMP, объясни?
0
|
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
|
|
07.08.2014, 21:02 [ТС] | 28 |
Я не претендую Про метод услышал от Вас, про openmp от uglyPinokkio.
Пытаюсь сделать хоть как то. Можете накидать примерный план с producer/consumer? или скинуть литературу с примерчиками? План с кусками кода лучше всего, конечно
0
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
07.08.2014, 23:57 | 29 |
Producer - поток, читающий файл и помещающий блоки данных в потокобезопасную очередь. Consumer - поток, берущий блоки данных из потокобезопасной очереди, считающий и записывающий хеш.
Вбей в гугле "producer consumer" или "производитель потребитель" и выбери сам то, что поймешь лучше. Код простой, должен сам осилить а вообще советую использовать для этого дела библиотеку Intel TBB - это можно сказать STL параллельного программирования.
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
||||||
08.08.2014, 07:58 | 30 | |||||
Сообщение было отмечено Afrit как решение
Решение
Это отмапить файл и посчитать в цикле хеши сложно?
Примерно так: Кликните здесь для просмотра всего текста
1
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
08.08.2014, 08:41 | 31 |
Я не говорю, что это сложно. Я говорю, что это ненужное усложнение в коде, которое данной задаче не требуется.
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
08.08.2014, 08:42 | 32 |
Ну вон в 40 строк усложненное решение, простое должно быть видимо короче?
UP. И оно само параллелится по количеству ядер в среде исполнения, отметим на всякий случай.
0
|
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
|
||||||
08.08.2014, 11:09 [ТС] | 33 | |||||
Здорово! Спасибо!
Есть еще пару глупых вопросов. 1) Почему так нельзя?
2) А можно в данной программе применить smart pointers? Я читал про них, но в основном говорится про то, что удобно подчищаться память за объектами, созданными с new. В деструкторе. Тут ничего с new не создается.
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
08.08.2014, 11:50 | 34 |
Да не за что. С такой функцией нет большого смысла параллелить расчет, узким местом будет чтение с диска.
Попробуй распараллелить вычисление хеша вместе с отображением файла. Ну видимо определен дефайн UNICODE. LPWSTR - это указатель на строку, в которой каждый символ занимает два байта. А зачем?
0
|
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
|
|
08.08.2014, 12:21 [ТС] | 35 |
Про вычисление хэша понятно. Попробую. А вместе с отображением файла - то, что уже сделано? дробление окна на блоки? или нет?
А тут в задании это есть, как дополнение (многопоточность тоже там была). Этим часто пользуются? И как это можно применить, если можно?
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
08.08.2014, 13:13 | 36 |
Нет. Можно попробовать сделать несколько окон размером в один блок в разных потоках.
smart pointers - понятие широкое, используется для автоматизации управления памятью, куда их применить в этой задаче - я без понятия.
0
|
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
|
||||||
08.08.2014, 13:43 [ТС] | 37 | |||||
uglyPinokkio, ясно. Тогда smart pointers пока оставлю.
А если я хочу запустить программу из командой строки, указывая путь и размер блока, нужно сделать path и dwBytesInBlock глобальными? Потом
И еще, например, размер блока сделать необязательной переменной для ввода. Если пользователь не ввел размер, то программа сама задаст ей размер. Как это можно реализовать? Я почитал про функции с переменным количеством переменных и везде только int Func (int a,...). То есть произвольное количество переменных int на входе. А тут точно знаем 1 или 2 переменные, но разного формата
0
|
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
|
|
08.08.2014, 14:10 | 38 |
с main так не получится.
http://lord-n.narod.ru/downloa... 6/0604.htm Глобальным ничего делать не надо, В main разбираешь параметры, если что-то не задано, присваиваешь значение по умолчанию и передаешь в свою функцию.
0
|
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
|
|
08.08.2014, 18:12 [ТС] | 39 |
uglyPinokkio, Только радовался, что все работает. А тут обнаружил совсем непонятную проблему.
Если ввести количество байт не равное мегабайту. То программа вылетает.... Необработанное исключение по адресу 0x00BE56E3 в Map5.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x0004CCCB Из-за чего это? Проект прикрепляю.
0
|
08.08.2014, 18:12 | |
08.08.2014, 18:12 | |
Помогаю со студенческими работами здесь
39
Чтение и запись в файл Запись и чтение в файл Чтение запись в файл Чтение и запись в файл Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |