С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/89: Рейтинг темы: голосов - 89, средняя оценка - 4.79
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128

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

06.08.2014, 01:01. Показов 17427. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Хочу решить следующую задачу:
Есть большой бинарный файл (несколько гигабайт к примеру). Нужно разбить этот файл на части и записать в другой файл хэши этих частей, используя многопоточность (многопроцессорность). С ней я никогда не работал. Читал про процессы, потоки и т.д. Но никогда не использовал в программах.
Предполагаю сделать так
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;
}
 
 
}
Думаю, как использовать мьютексы. Был бы признателен за подсказки, как грамотнее реализовать эту задачу. Может быть дробление, чтение файла лучше реализовывать по другому? Или многопоточность использовать по другому? Пока я предполагал, что один поток будет читать и дробить в файлы, другой хэшировать и записывать. Заранее спасибо!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.08.2014, 01:01
Ответы с готовыми решениями:

Открыть текстовый файл в необходимом режиме (на чтение, на чтение и запись, на добавление)
Открыть текстовый файл в необходимом режиме (на чтение, на чтение и запись, на добавление). (В файле должно быть не менее 30 строк)....

Чтение/запись в файл
Почему то попытка создать файл для записи или открыть какой либо файл для чтения оказывается неудачной, в чем может быть причина? string...

Чтение и запись в файл
Здраствуйте, я в c++ оч плохо разбираюсь, помогите пожалуйсто, мне нужен скрипт который открывал бы фаил, брал из него текст дописывал бы в...

38
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
06.08.2014, 05:18
Скажу что думаю, возможно не прав.
Допустим файл записан на диске. Используем для чтения многопоточность.
Работают несколько потоков. первый поток сдвигает головку для чтения в нужный ему
сектор диска, читает. Тут второй поток, ему нужно тоже читать в своем секторе.
Приостанавливается первый поток, работает второй. Тут вмешивается третий .. потом четвертый и т.д.
И так головку дергаем туда-сюда, и какой же тут выигрыш ?
Поэтому для чтения многопоточность не нужна.
0
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
06.08.2014, 13:20  [ТС]
Цитата Сообщение от MrCold Посмотреть сообщение
Поэтому для чтения многопоточность не нужна.
Я решил также. Потому решил, что каждый поток будет отвечать за свою функцию. Один читает, другой, например, хэширует.

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

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

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

Мапишь окно размер_блока*количество ядер
в потоках считаешь хеши блоков
двигаешь окно дальше.
1
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
07.08.2014, 09:30  [ТС]
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
в потоках считаешь хеши блоков
Не очень понимаю. Мы взяли один блок
C++
1
PBYTE pbFile = (PBYTE)MapViewOfFile(...)
То есть многопоточность применить в хэш фунции?
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
07.08.2014, 09:49
Цитата Сообщение от Afrit Посмотреть сообщение
Мы взяли один блок
Не один, а по количеству ядер. Дальше в цикле по количеству блоков считаем хеш блока.
Вот этот цикл распараллеливаем.
1
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
07.08.2014, 11:57  [ТС]
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Не один, а по количеству ядер. Дальше в цикле по количеству блоков считаем хеш блока.
Вот этот цикл распараллеливаем.
Распараллелил цикл получения хэш функции.
Про количество блоков все равно не понял..
Прикрепляю солюшен. В файле crc добавил OMP. А вот с блоками что делать?
Вложения
Тип файла: rar Map2.rar (7.57 Мб, 6 просмотров)
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
07.08.2014, 12:25
Цитата Сообщение от 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);
}
Дальше мапим следующий участок файла. И так до конца.
Или я чего-то не понимаю, или не умею объяснять.
0
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
07.08.2014, 12:32  [ТС]
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Сорсы-то где?
Забыл добавить. Прикрепляю.
Вложения
Тип файла: rar source.rar (5.9 Кб, 9 просмотров)
0
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
07.08.2014, 12:39  [ТС]
Цитата Сообщение от 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 Посмотреть сообщение
Дальше мапим следующий участок файла. И так до конца.
Или я чего-то не понимаю, или не умею объяснять.
На самом деле очень здорово объясняете. Меня смутила фраза про то, что у нас одновременно участвует несколько блоков. Это же не так верно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.08.2014, 12:39
Помогаю со студенческими работами здесь

Чтение и запись в файл
Задача такая: Есть файл data.txt, в нем хранятся фамилии, номера телефонов и года регистрации в таком виде: *fфамилия 1 *nномер 1 ...

Чтение и запись в файл
Текст находится в файле, имя которого вводится с клавиатуры. Вывод результата также осуществляется одновременно в файл, имя которого...

Запись и чтение в файл
Вариант 1 Написать программу, которая считывает из текстового файла три предложения и выводит их в обратном порядке. Вариант 2 ...

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

Чтение и запись в файл
#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main() { int S, x, i, z, k,f; ofstream f(&quot;2.txt&quot;,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru