Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.76
Afrit
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
#1

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

06.08.2014, 01:01. Просмотров 2833. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2014, 01:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение/запись в файл с использованием многопоточности (C++):

Чтение и запись в файл - C++
Помогите пожалуйста написать программу, которая считывает из текстового файла и записывает в новый файл только строки, содержащие двоичные...

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

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

Чтение и запись в файл - C++
#include<iostream> #include<fstream> using namespace std; void main() { setlocale(LC_ALL, "Russian"); int a, b; ...

Чтение и запись в файл - C++
Подскажите, как сделать так, чтобы информация считывалась с текстового файла, а не с консоли #include "map.h" void main(void) { ...

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

38
MrCold
855 / 753 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
06.08.2014, 05:18 #2
Скажу что думаю, возможно не прав.
Допустим файл записан на диске. Используем для чтения многопоточность.
Работают несколько потоков. первый поток сдвигает головку для чтения в нужный ему
сектор диска, читает. Тут второй поток, ему нужно тоже читать в своем секторе.
Приостанавливается первый поток, работает второй. Тут вмешивается третий .. потом четвертый и т.д.
И так головку дергаем туда-сюда, и какой же тут выигрыш ?
Поэтому для чтения многопоточность не нужна.
0
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);
Или можно только сначала и до определенного места?
0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
06.08.2014, 13:42 #4
Отображай содержание файла в память и с памятью уже затем и работай ( см. memory mapped files )
3
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 );
А что с этим делать дальше?
0
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
06.08.2014, 15:11 #6
Цитата Сообщение от Afrit Посмотреть сообщение
много раз про то слышал, но ни разу не видел, как это нормально реализуется.
http://wm-help.net/books-online/book/59464/59464-10.html
2
Afrit
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
06.08.2014, 17:55  [ТС] #7
uglyPinokkio, Спасибо! Сейчас буду пробовать. А если размер файла больше доступной памяти? Мы ведь резервируем пространство, равное размеру файла, нет?
0
Voivoid
675 / 278 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
06.08.2014, 20:39 #8
Цитата Сообщение от Afrit Посмотреть сообщение
если размер файла больше доступной памяти?
http://en.wikipedia.org/wiki/Page_fault
1
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
06.08.2014, 21:44 #9
Цитата Сообщение от Afrit Посмотреть сообщение
А если размер файла больше доступной памяти?
Там же у Рихтера есть пример работы с файлом 8 гигабайт.

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

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

Мапишь окно размер_блока*количество ядер
в потоках считаешь хеши блоков
двигаешь окно дальше.
1
Afrit
6 / 6 / 1
Регистрация: 27.08.2013
Сообщений: 128
07.08.2014, 09:30  [ТС] #15
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
в потоках считаешь хеши блоков
Не очень понимаю. Мы взяли один блок
C++
1
PBYTE pbFile = (PBYTE)MapViewOfFile(...)
То есть многопоточность применить в хэш фунции?
0
07.08.2014, 09:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2014, 09:30
Привет! Вот еще темы с ответами:

Чтение и запись в файл - C++
В общем мне нужно читать из файла таблицу и пихать её в стек, а так же этот стек запихнуть обратно в файл.Однако если просто записывать...

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

Чтение и запись в файл - C++
Люди скиньте пожалуйста информацию по этой теме "Чтение и запись в файл" Очень надо

Чтение и запись в файл - C++
#include <iostream> #include <fstream> using namespace std; int main() { int S, x, i, z, k,f; ofstream f("2.txt",...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru