Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/22: Рейтинг темы: голосов - 22, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 13
1

Параллельная обработка файлов

14.01.2015, 20:35. Показов 4265. Ответов 25
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не понимаю как организовать параллельную обработку файлов в данной программе.
Смысл в том что есть папка в которой идут txt файлы, в этих файлах есть числа, мы считываем из файла число и выводим в консоль рядом с названием файла, а затем считаем сумму всех чисел.
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <vector>
#include <boost\filesystem.hpp>
#include <boost\filesystem\fstream.hpp>
#include <boost\thread\thread.hpp>
 
 
using namespace std;
namespace fs = boost::filesystem;
 
int main()
{   
    setlocale(LC_ALL, "rus");
    vector<int> values;
    FILE* txt;
    fs::path path("c:\\text");
 
    int result = 0;
 
    cout << "Введите путь к файлам (*.txt): ";
    cin >> path;
    cout << endl;
 
    for (fs::directory_iterator it(path); it != fs::directory_iterator(); ++it)
    {
        if (it->path().extension() == ".txt")
        {
            fs::ifstream ifs(*it);
            if (ifs.is_open())
            {
                int val;
                ifs >> val;
                values.push_back(val);
                cout << it->path().filename() << ":" << val << endl;
                txt = fopen(it->path().string().c_str(), "r");
                fclose(txt);
            }
            else
                cerr << "Ошибка!" << endl;
        }
    }
 
    boost::this_thread::sleep(boost::posix_time::milliseconds(100));
 
    if (values.empty())
    {
        cerr << "Ошибка! Чисел нет!" << endl;
    }
    else
    {
        for (int i = 0; i < values.size(); i++)
        {
            result = values[i] + result;
        }
        cout << "Сумма всех чисел: " << result << endl;
    }
 
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.01.2015, 20:35
Ответы с готовыми решениями:

Параллельная обработка
Добрый день! Подскажите, пожалуйста, как параллельно считать содержимое всех файлов из...

Чтение строки неограниченной длины и её параллельная обработка
Здравствуйте. В ходе реализации алгоритма для поиска возникла проблема в том, что в условии...

Параллельная обработка файлов
Здравствуйте. Подскажите пожалуйста как на с++ реализовать обработку файлов параллельно в несколько...

Параллельная обработка очереди файлов
Добрый день! Подскажите пожалуйста, каким образом лучше решить следующую задачу: Имеется...

25
Заблокирован
14.01.2015, 21:09 2
impowski, когда заходите в папку обнулите счетчик числе в данной папке. При считывании очередного числа из файла, добавляйте к тому самому счетчику. Ну а вывести его нужно, видимо, когда выйдите из этой папки.
0
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 13
14.01.2015, 21:12  [ТС] 3
rocknrolla1, я не понял к чему это.
0
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
14.01.2015, 21:37 4
impowski, вижу что у тебя подключаются thread.hpp
но где сами потоки?

зачем в main
Цитата Сообщение от impowski Посмотреть сообщение
boost::this_thread::sleep(boost::posix_time::milliseconds(100));
?

и зачем смешивать потоки ifstream и низкоуровневые fopen/fclose ?
0
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 13
14.01.2015, 21:40  [ТС] 5
Подключается, но я не знаю пока что как его использовать, сделал только sleep как по заданию сказано, мол усыпить текущий поток на 1 секунду. Насчет ifstream я сделал так как знаю, поэтому и спрашиваю насчет потоков.
0
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
14.01.2015, 22:54 6
к примеру - имеешь список имен файлов, которые нужно открыть создаешь вектор потоков, передаешь каждому функтор который открывает файл и считывает число. Создавать на каждый файл поток слишком расточительно - тем более что файлов может быть очень много, поэтому пусть функтор принимает диапазон имен файлов, то есть передавать функтору итераторный диапазон. В функторе проходишь по этому диапазону,открываешь каждый файл, считываешь данные. Нужно еще придумать как красиво возвращать считанное значение ассоциированное с именем файла в основной поток. Положим на выходе получится список состоящий из пар имя файла-прочитанное число. Потом их выводишь на экран и суммируешь числа.

Добавлено через 44 секунды
Цитата Сообщение от impowski Посмотреть сообщение
boost::this_thread::sleep(boost::posix_time::milliseconds(100));
+ ко всему, 1 секунда = 1000 миллисекунд )
0
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 13
14.01.2015, 23:01  [ТС] 7
Кудаив, тут проблема еще в том что у меня нет списка имен файлов, названия любые я их не знаю и программа тоже, то есть я в функцию передаю значение directory_iterator. Потом циклом прохожу по файлам, открываю файлы считываю данные например в вектор, затем вывожу, а потом суммирую, но как мне это все организовать грамотно.
0
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
15.01.2015, 08:47 8
а directory_iterator не позволяет получить полный путь до файла? проходишь итератором по директории, составляешь список файлов
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
15.01.2015, 09:12 9
Лол, тебе тоже дали такое тестовое задание? Банально надо определиться с архитектурой проги и от этого танцевать. Перекрытый ввод-вывод, порты завершения, обычные потоки, пулы потоков, OMP - вариантов море.
0
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
15.01.2015, 10:40 10
Enno, impowski, а подскажите откуда сие тестовое задание?))
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
15.01.2015, 10:53 11
Откликнулся на вакансию - прислали задание. Сделал, сдал. Хз правильно или нет, но у меня всё работает.
0
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
15.01.2015, 11:10 12
Цитата Сообщение от Enno Посмотреть сообщение
Откликнулся на вакансию - прислали задание. Сделал, сдал. Хз правильно или нет, но у меня всё работает.
компанию назови)
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
15.01.2015, 11:29 13
Секрет!
0
Кудаив
15.01.2015, 11:45
  #14

Не по теме:

приду и заберу твое место! ]:->

0
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
15.01.2015, 12:44 15
Лучший ответ Сообщение было отмечено impowski как решение

Решение

Вот вам мой вариант:
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
#define BOOST_THREAD_VERSION 4
#include <boost/thread.hpp>
 
namespace fs = boost::filesystem;
 
long long read_and_calc(const fs::path &p) {
   fs::ifstream ifs(p);
   if (ifs.is_open()) {
      return std::accumulate(std::istream_iterator<int>(ifs),
                             std::istream_iterator<int>(), 0LL);
   }
   return 0;
}
 
template <typename Iter>
long long bloc_calc(Iter first, Iter last) {
   long long res = 0;
   while (first != last) res += read_and_calc(*first++);
   return res;
}
 
int main()
{
   fs::path directory_path("D:\Temp");
   std::vector<fs::path> files{fs::recursive_directory_iterator(directory_path),
            fs::recursive_directory_iterator()};
 
   // remove all except .txt files:
   files.erase(std::remove_if(files.begin(), files.end(),
                              [](const fs::path &p){return !fs::is_regular_file(p)
            || p.extension() != ".txt";}
   ), files.end() );
 
   std::size_t num_threads = boost::thread::hardware_concurrency();
   std::size_t block_size = files.size() / num_threads;
   std::vector<boost::future<long long>> futures;
 
   using iter = std::vector<fs::path>::const_iterator;
   for (iter start = files.begin(); start != files.end(); start += block_size) {
      futures.push_back(boost::async(boost::launch::async,
                        bloc_calc<iter>, start, start + block_size));
   }
 
   long long sum = 0;
   for (auto& f : futures) {
      sum += f.get();
   }
   std::cout << "Sum of all sums of all numbers into all txt files: " << sum << "\n";
}
Добавлено через 1 минуту
Особо не тестил, но должно работать.

Добавлено через 53 секунды

Не по теме:

Цитата Сообщение от Кудаив Посмотреть сообщение
приду и заберу твое место!
Смотрите не подеритесь

2
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
15.01.2015, 12:54 16
Цитата Сообщение от DiffEreD Посмотреть сообщение
long long read_and_calc(const fs::path &p) {
* *fs::ifstream ifs(p);
* *if (ifs.is_open()) {
* * * return std::accumulate(std::istream_iterator<int>(ifs),
* * * * * * * * * * * * * * *std::istream_iterator<int>(), 0LL);
* *}
* *return 0;
}
а если файл не открылся по какому либо поводу, а вернется все равно нуль
0
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
15.01.2015, 12:57 17
Так и задумано - мы же суммы складываем.
0
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
15.01.2015, 13:03 18
Цитата Сообщение от DiffEreD Посмотреть сообщение
Так и задумано - мы же суммы складываем.
для суммы сойдет, но перед этим выводятся пары имя файла - прочитанное значение и если файл не откроется то будет заведомо выведена ложь
0
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
15.01.2015, 13:06 19
Всякие недочеты пускай ТС себе доработает сам.
0
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
15.01.2015, 13:22 20
Цитата Сообщение от DiffEreD Посмотреть сообщение
Всякие недочеты пускай ТС себе доработает сам.
я б сказал, код пусть сам ТС пишет
0
15.01.2015, 13:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.01.2015, 13:22
Помогаю со студенческими работами здесь

Параллельная обработка нескольких файлов в потоках, обрабатывается только последний
Добрый день! У меня следующая задача. Мне необходимо конвертировать бинарные файлы в нормальный...

Параллельная обработка изображений
Добрый день, на данный момент начал изучение темы параллельных вычислений. Написал простую...

Параллельная обработка данных
Здравствуйте) Помогите найти суть проблемы. У меня реализован класс поставщик/потребитель для...

Параллельная обработка односвязных списков
Здравствуйте! Помогите, пожалуйста, с решением вот такой задачи: Демонстрационная программа...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru