Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 17.01.2018, 12:46   #1
olena_nov
 
Регистрация: 26.12.2017
Сообщений: 8
Репутация: 10
По умолчанию Определить, сколько раз каждый символ встречается в файле через многопоточность

Мой код. Написала что смогла. Теперь нужна ваша помощь. Подскажите
что не правильно. И как лутче подщет делать?
Код:

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <string>
#include <vector>
#include <atomic>
#include <thread>

void TextThread(std::string str)
{
	std::ifstream text(str);
	if (!text)
		std::cout << "No open file" << "\n";

	std::istream_iterator<char> input(text);
	std::istream_iterator<char> output;
	
	std::vector<char> symvol(input, output);

	unsigned maxThreadCount = std::thread::hardware_concurrency();
	const std::size_t minLength = symvol.size() / maxThreadCount;
	const std::size_t modulo = symvol.size() % maxThreadCount;

	std::vector<std::size_t> results;
	results.reserve(maxThreadCount);

	std::vector<std::thread> threads;
	threads.reserve(maxThreadCount - 1);
	for (std::size_t i = 0; i < modulo; ++i)
		results.emplace_back(minLength + 1);

	if (minLength > 0)
	{
		for (std::size_t i = modulo; i < maxThreadCount; ++i)
			results.emplace_back(minLength);
	}
	for (std::size_t i = 1; i < threads.size(); ++i)
		threads.emplace_back(threads[i - 1] + 1, threads[i - 1] + threads[i]);

	std::for_each(threads.begin(), threads.end(), std::mem_fn(&std::thread::join));
	

	for (unsigned int i = 0; i < symvol.size(); ++i)
		std::cout << symvol[i] << "\n";
}

int main()
{
	TextThread("D:\\text.txt");
    return 0;
}

olena_nov вне форума   Ответить с цитированием
Старый 01.02.2018, 13:59   #2
alexzk
Участник клуба
 
Регистрация: 12.04.2017
Сообщений: 889
Репутация: 172
По умолчанию

Эт че за магия?
Код:

for (std::size_t i = 1; i < threads.size(); ++i)
		threads.emplace_back(threads[i - 1] + 1, threads[i - 1] + threads[i]);

Вообще идеально просто было бы вот это
https://gcc.gnu.org/onlinedocs/libst...ode_using.html

__gnu_parallel::for_each

но заработает не на всех компиляторах.

В вашем случае, делаете массив потоков, пока там почти все верно. Дальше, весь текстовый файл делите на интервалы равные, каждый поток работает со своим интервалом исходного файла (это еще массив {начало-конец}). Далее каждый поток проходит циклом свой интервал от начала до конца и изменяет АТОМАРНЫЙ std::atomic<int> счетчик в массиве счетчиков(общем). Массив счетчиков имеет размер 256 по числу кодов букв, т.е. вы раздельно считаете каждый символ по его коду.

Если в задаче допустимо более 256 символов (т.е. юникод - китайский, японский и т.д.). То массив счетчиков нужна заменять на карту счетчиков (std::map<size_t, std::atomic<int>>). Получать ссылку/указатель на него, предварительно обезопасив через std::mutex, но это сильно просадит производительность.

Последний раз редактировалось alexzk; 01.02.2018 в 14:04.
alexzk вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужно написать программу в с++. определить длину строки и определить сколько раз встречается буква П в строке. chit Помощь студентам 4 11.07.2015 15:03
Определить сколько раз слово встречается в файлах. McFrey Помощь студентам 10 06.04.2015 22:02
Программа на Delphi, считающая сколько раз в тексте встречается каждый символ, биграмма, триграмма denis_dneprovski Помощь студентам 17 11.10.2010 06:15
Как подсчитать сколько раз встречается символ в строке? zver777 Общие вопросы Delphi 10 10.01.2010 01:57
PHP.Как посчитать, сколько раз слово встречается в файле? Princesse Помощь студентам 0 07.12.2009 01:24


03:35.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru