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

Чтение/запись в файл с использованием многопоточности - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.76
Afrit
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
06.08.2014, 01:01     Чтение/запись в файл с использованием многопоточности #1
Доброго времени суток!
Хочу решить следующую задачу:
Есть большой бинарный файл (несколько гигабайт к примеру). Нужно разбить этот файл на части и записать в другой файл хэши этих частей, используя многопоточность (многопроцессорность). С ней я никогда не работал. Читал про процессы, потоки и т.д. Но никогда не использовал в программах.
Предполагаю сделать так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "header.h"
using namespace std;
 
void read_file( mutex& m_arr, mutex& m_out) {
    int num;
    
        FILE *fin, *fout;
        size_t k;
        char buf[1024];
        fin = fopen("input.txt", "r");
 
        while (!feof(fin))
        {
            m_arr.lock();
            k = fread(buf, sizeof(char), 100, fin);
    
        }
        fclose(fin);
        
}
void write_file( mutex& m_arr, mutex& m_out) {
    int i = 0, num;
    
}
 
int main()
{
    
    mutex m_arr, m_out;
    thread read_thread(read_file, ref(m_arr), ref(m_out));
    thread write_thread(write_file, ref(m_arr), ref(m_out));
    if (read_thread.joinable()) read_thread.join();
    if (write_thread.joinable()) write_thread.join();
    
    return 0;
}
 
 
}
Думаю, как использовать мьютексы. Был бы признателен за подсказки, как грамотнее реализовать эту задачу. Может быть дробление, чтение файла лучше реализовывать по другому? Или многопоточность использовать по другому? Пока я предполагал, что один поток будет читать и дробить в файлы, другой хэшировать и записывать. Заранее спасибо!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2014, 01:01     Чтение/запись в файл с использованием многопоточности
Посмотрите здесь:

C++ Чтение запись в файл
[C++]Чтение и запись в файл C++
C++ Чтение и запись в файл
Запись и чтение в файл C++
C++ Чтение и запись в файл
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
06.08.2014, 05:18     Чтение/запись в файл с использованием многопоточности #2
Скажу что думаю, возможно не прав.
Допустим файл записан на диске. Используем для чтения многопоточность.
Работают несколько потоков. первый поток сдвигает головку для чтения в нужный ему
сектор диска, читает. Тут второй поток, ему нужно тоже читать в своем секторе.
Приостанавливается первый поток, работает второй. Тут вмешивается третий .. потом четвертый и т.д.
И так головку дергаем туда-сюда, и какой же тут выигрыш ?
Поэтому для чтения многопоточность не нужна.
Afrit
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
06.08.2014, 13:20  [ТС]     Чтение/запись в файл с использованием многопоточности #3
Цитата Сообщение от MrCold Посмотреть сообщение
Поэтому для чтения многопоточность не нужна.
Я решил также. Потому решил, что каждый поток будет отвечать за свою функцию. Один читает, другой, например, хэширует.

Добавлено через 5 часов 9 минут
А можно ли читать файл с помощью read по частям?
C++
1
2
ifstream f (filename,std::ios::binary);
f.read(buf,1024);
Или можно только сначала и до определенного места?
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,283
06.08.2014, 13:42     Чтение/запись в файл с использованием многопоточности #4
Отображай содержание файла в память и с памятью уже затем и работай ( см. memory mapped files )
Afrit
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
06.08.2014, 14:59  [ТС]     Чтение/запись в файл с использованием многопоточности #5
Voivoid, много раз про то слышал, но ни разу не видел, как это нормально реализуется. На msdn нашел хорошие примеры на C#, но не C++.
Не подскажите как использовать? Кажется, реализация есть в разных библиотеках?
Эта из буста нашел.
C++
1
2
file_mapping m_file       
   ("C:/input.txt" ,read_write );
А что с этим делать дальше?
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
06.08.2014, 15:11     Чтение/запись в файл с использованием многопоточности #6
Цитата Сообщение от Afrit Посмотреть сообщение
много раз про то слышал, но ни разу не видел, как это нормально реализуется.
http://wm-help.net/books-online/book.../59464-10.html
Afrit
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
06.08.2014, 17:55  [ТС]     Чтение/запись в файл с использованием многопоточности #7
uglyPinokkio, Спасибо! Сейчас буду пробовать. А если размер файла больше доступной памяти? Мы ведь резервируем пространство, равное размеру файла, нет?
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,283
06.08.2014, 20:39     Чтение/запись в файл с использованием многопоточности #8
Цитата Сообщение от Afrit Посмотреть сообщение
если размер файла больше доступной памяти?
http://en.wikipedia.org/wiki/Page_fault
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
06.08.2014, 21:44     Чтение/запись в файл с использованием многопоточности #9
Цитата Сообщение от Afrit Посмотреть сообщение
А если размер файла больше доступной памяти?
Там же у Рихтера есть пример работы с файлом 8 гигабайт.

Код
Я обещал рассказать, как спроецировать на небольшое адресное просранство файл длиной 16 экзабайтов. Так вот, этого сделать нельзя Вам придется проецировать не весь файл, а сго представление, содержащее лишь некую часть данных Вы начнете с того, что спроецируете представление самого начала файла Закончив обработку дан ных в этом представлении, Вы отключите его и спроецируете представление следую щей части файла — и так до тсх пор, пока нс будет обработан весь файл
Afrit
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
06.08.2014, 23:03  [ТС]     Чтение/запись в файл с использованием многопоточности #10
uglyPinokkio, Как раз решил попробовать собрать эту программу. Путем докручивания разных библиотек и прибавления TEXT перед путем к файлу. У меня есть электронный учебник Рихтера и там есть TEXT (без этого ругается на несоответствие форматов).
Программа не находит нулевых байтов.... Не знаю в чем проблема.
Вложения
Тип файла: rar Maping.rar (7.41 Мб, 3 просмотров)
Afrit
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
06.08.2014, 23:56  [ТС]     Чтение/запись в файл с использованием многопоточности #11
Прошу прощения. Программа работает.
У нас есть спроецированный файл, его делим по блокам. Делаем с блоками что то(например, рассчитываем хэш). Как реализовать тут многопоточность грамотно? И к чему её можно прикрутить?
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
07.08.2014, 05:33     Чтение/запись в файл с использованием многопоточности #12
Цитата Сообщение от Afrit Посмотреть сообщение
Как реализовать тут многопоточность грамотно?
Если просто посчитать хеш отдельных блоков - OpenMP.

https://parallel.ru/info/parallel/openmp
Afrit
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
07.08.2014, 09:23  [ТС]     Чтение/запись в файл с использованием многопоточности #13
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Если просто посчитать хеш отдельных блоков
Спасибо сейчас буду читать. Только не понимаю, какие действия выполнять разными потоками?
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
07.08.2014, 09:29     Чтение/запись в файл с использованием многопоточности #14
Цитата Сообщение от Afrit Посмотреть сообщение
Только не понимаю, какие действия выполнять разными потоками?
Ну я бы делал примерно так:

Мапишь окно размер_блока*количество ядер
в потоках считаешь хеши блоков
двигаешь окно дальше.
Afrit
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
07.08.2014, 09:30  [ТС]     Чтение/запись в файл с использованием многопоточности #15
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
в потоках считаешь хеши блоков
Не очень понимаю. Мы взяли один блок
C++
1
PBYTE pbFile = (PBYTE)MapViewOfFile(...)
То есть многопоточность применить в хэш фунции?
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
07.08.2014, 09:49     Чтение/запись в файл с использованием многопоточности #16
Цитата Сообщение от Afrit Посмотреть сообщение
Мы взяли один блок
Не один, а по количеству ядер. Дальше в цикле по количеству блоков считаем хеш блока.
Вот этот цикл распараллеливаем.
Afrit
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
07.08.2014, 11:57  [ТС]     Чтение/запись в файл с использованием многопоточности #17
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Не один, а по количеству ядер. Дальше в цикле по количеству блоков считаем хеш блока.
Вот этот цикл распараллеливаем.
Распараллелил цикл получения хэш функции.
Про количество блоков все равно не понял..
Прикрепляю солюшен. В файле crc добавил OMP. А вот с блоками что делать?
Вложения
Тип файла: rar Map2.rar (7.57 Мб, 3 просмотров)
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
07.08.2014, 12:25     Чтение/запись в файл с использованием многопоточности #18
Цитата Сообщение от Afrit Посмотреть сообщение
Прикрепляю солюшен
Сорсы-то где?

Цитата Сообщение от Afrit Посмотреть сообщение
Распараллелил цикл получения хэш функции.
Ну идея была примерно такова:

Мапим часть файла, размером, равным произведению размера блока на количество ядер.
Имеем указатель на начало этого участка. Далее пишем цикл, типа:

C++
1
2
3
4
5
#pragma omp parallel for
for(int block_n=0; block_n<block_cnt;block_n++)
{
   gethash(data_start+block_n*block_size,block_size);
}
Дальше мапим следующий участок файла. И так до конца.
Или я чего-то не понимаю, или не умею объяснять.
Afrit
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
07.08.2014, 12:32  [ТС]     Чтение/запись в файл с использованием многопоточности #19
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Сорсы-то где?
Забыл добавить. Прикрепляю.
Вложения
Тип файла: rar source.rar (5.9 Кб, 5 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2014, 12:39     Чтение/запись в файл с использованием многопоточности
Еще ссылки по теме:

Чтение/запись в файл C++
Чтение и запись в файл C++
C++ Чтение и запись в файл

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

Или воспользуйтесь поиском по форуму:
Afrit
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
07.08.2014, 12:39  [ТС]     Чтение/запись в файл с использованием многопоточности #20
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Мапим часть файла, размером, равным произведению размера блока на количество ядер.
Имеем указатель на начало этого участка. Далее пишем цикл, типа:
Я правильно полагаю, что вот в этом коде мы мапим часть файла (не равное размеру блока на количество ядер)?
C++
1
2
3
4
5
6
7
8
9
DWORD dwBytesInBlock = sinf.dwAllocationGranularity;
 
        if (qwFileSize < sinf.dwAllocationGranularity)
 
            dwBytesInBlock = (DWORD)qwFileSize;
 
        PBYTE pbFile = (PBYTE)MapViewOfFile(hFileMapping, FILE_MAP_READ, (DWORD)(qwFileOffset >> 32), // начальный байт 
            (DWORD) (qwFileOffset & 0xFFFFFFFF), // в файле
            dwBytesInBlock); // число проецируемых байтов
На этом этапе у нас есть блок. Никаких параллелей пока нет.
А потом мы добавляем параллельность при расчете хэша. Я правильно её реализовал, кстати?
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Дальше мапим следующий участок файла. И так до конца.
Или я чего-то не понимаю, или не умею объяснять.
На самом деле очень здорово объясняете. Меня смутила фраза про то, что у нас одновременно участвует несколько блоков. Это же не так верно?
Yandex
Объявления
07.08.2014, 12:39     Чтение/запись в файл с использованием многопоточности
Ответ Создать тему
Опции темы

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