Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/131: Рейтинг темы: голосов - 131, средняя оценка - 4.52
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549

Архитектура: парсинг и выгрузка текстовиков

11.03.2020, 10:51. Показов 32420. Ответов 421

Студворк — интернет-сервис помощи студентам
начало было положено в ветке - Считать текстовые файлы из папки - там и возник вопрос об Архитектуре...
Цитата Сообщение от JeyCi Посмотреть сообщение
так и не собрала эти все объекты этого класса в group class...
вроде уже собрала...
осталось отображение создать (типа I_tbl_Show) и пронаследовать ? в разные классы пункта назначения (или на консоль, или в файл, или в БД, или допустим ещё в форму)... N.B. классы (пункты-назначения) делать не надо - эти View уже реализованы разработчиками того ПО, на котором сейчас идёт работа...
а) пока что можно просто прописать функции-члены класса; и по месту использовать, что надо при разработке - в файл или на консоль;
б) в перспективе для Release - реализовать и откомпилировать и выгрузку и в файл, и выгрузку в БД, и отражение в DataGrid...
===
!! Т.Е. если в Release захочется и выгрузку в текст, и в БД, и допустим ещё в форму (например с разных кнопок сделать) - тут уж лучше и писать, как положено, наследование??... -- к слову из прошлой ветки о:
Цитата Сообщение от JeyCi Посмотреть сообщение
полагаю тут Наследования никакого не пригодится?
... или как раз тут (при выборе направления выгрузки) его (наследование) делать??
===
Обоснование выбора уровня Абстракции (I_tbl_Show со всеми виртуальными функциями):
чтобы не дублировать код-сбора-для-выгрузки -- сделать class Table - и класс-интерфейс I_tbl_Show, в котором обозначить virtual-функции выгрузки... эти функции определить в др. классах - типа Interface (IwriteCSV, IwriteDB, IwriteDataGrid)...
p.s.
классы консоль, файл, бд, DataGrid - не создаём, т.к. эти пункты назначения уже присутствуют...
p.p.s.
вывести конечные интерфейсы с определёнными методами записи на кнопки...
===
ИЛИ то, что подчёркнуто чуть выше, стоит реализовать в одном классе Table, и здесь же задать все virtual функции ??
===
на скрине: синие - классы, зелёные - интерфейсы (в с++ по сути тоже классы)
птицами отмечены уже кое-как реализованные классы (2 птицы)
курсивные стрелки - отсутствие наследования


Добавлено через 7 минут
вобщем вопрос:
class Table и класс I_Tbl_Show - объединить или нет?

Добавлено через 10 минут
p.p.s.
чтобы избежать проблем Ромба и такого:
Неоднозначность при множественном наследовании
Цитата Сообщение от DrOffset Посмотреть сообщение
Тут нужно виртуальное наследование.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.03.2020, 10:51
Ответы с готовыми решениями:

Проверка двух текстовиков
Написать прогу на языке Си, проверяющую, совпадают ли тексты в двух файлах #include <stdio.h> #include <stdlib.h> ...

Access модуль объединения текстовиков
Добрый день. Очень нужен модуль access который будет объединять текстовые файлы с предложенной папки (каждый раз разные названия и...

Сделать скрипт для вывода текстов из текстовиков
Здравствуйте! Не могли бы помочь сделать скрипт для вывода текстов песен из текстовиков в папке. Расскажу подробней: есть папка с...

421
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
27.05.2020, 22:35  [ТС]
Студворк — интернет-сервис помощи студентам
ок покручу... в смысле future для этого и имела ввиду...
и в принципе по пулу есть примеры:
This is an example illustrating the use of the thread_pool object from the dlib C++ Library. In this example we will crate a thread pool with 3 threads and then show a few different ways to send tasks to the pool.
Распараллеливание сортировки, thread pool
... тут главное понять (в моём тз), где mutex(es) включать, где выключать?

Добавлено через 1 час 32 минуты
Простой пул потоков
Зачастую разработчику нет нужды реализовывать пул потоков самостоятельно. В языках высокого уровня эта функциональность уже встроена, а для остальных имеются библиотеки или каркасы, легко адаптирующиеся к собственным нуждам.
Добавлено через 24 минуты
там же ответ:
необходимость синхронизации по крайней мере одного общего ресурса — очереди заданий.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
28.05.2020, 10:25  [ТС]
Синхронизируйте доступ к разделяемым данным (лучше очередь или дек).
После того как поток получил ссылку, удаляйте ее из вашей структуры данных и освобождайте блокировку.
===
Класс для очереди задач м. см. в теме:
Реализовать пул потоков, в который можно помещать функцию
Кликните здесь для просмотра всего текста
? там почему-то пустой public:
C++
1
2
3
4
public:
    thread_save_queue()
    {
    }
-- это конструктор... думала, уже здесь можно mutex задать??

Добавлено через 8 минут

p.s.
для погружения в тему: (pdf)
C++ Concurrency in Action

Добавлено через 2 часа 15 минут
Синхронизация пула потоков
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.05.2020, 10:31
Цитата Сообщение от JeyCi Посмотреть сообщение
Класс для очереди задач м. см. в теме:
У меня тоже есть реализация примитивного пула потоков https://www.cyberforum.ru/blog... g5939.html
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
28.05.2020, 17:43  [ТС]
oleg-m1973, спасибо!, я хоть теперь в нужном направлении копаю - и уже что-то начинаю понимать...
1) кстати, встретилось, что 1 мьютекс на 1 элемент - очень жирно будет, обычно выделяют 1 мьютекс на 10 потоков, насколько поняла, т.е. на 10 элементов...
2) синхронизация что-то вроде... или здесь
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
std::thread thread1([](){/*do something*/});
std::thread thread2([](){/*do something*/});
std::thread thread3([](){/*do something*/});
thread1.join();
thread2.join();
thread3.join();   //или sleep_until можно и др

3) убить поток сложно - делать этого не нужно - т.к. проблеиатично освободить ресурсы, позакрывать сокеты и выполнить др. рутину... даже если если поток остановить из др потока
3)хотя boost'овские потоки можно interrupt и они надёжнее, чем std
4) смысл потока - на очень дорогостоящих вычислениях можно получить результат, а поток завершиться уже после получения результата
5) если работа непродолжительна, то затраты на создание и уничтожение потоков могут повлиять на производительность в худшую сторону
... вобщем надо прикинуть - подгрузка из сети мелких текстовиков даже в большом количестве - до 3000 за раз - будет ли более выгодна...
6) и всё-таки потоки, наверно, лучше запускать по количеству ядер... иначе, наверно, задачи будут стоять в очереди на ядро
7) по работе с сокетами (а даже GET в С++ выполняется на открытом сокете - принимающем, - насколько понимаю) - всё равно на сокете может выполняться только 1 процесс -- поэтому неуверена, что параллельность поможет... хотя конкурентность моего тз - может и позволит распараллелить задачу подгрузки и задачу записи в файл... т.е. so named Instruction-Level Parallelism... не Data-Level Parallelism
(8) исходя из (7) теперь понимаю, почему получала на Python (при использовании async-await) "Access Denied" - это от сокета... а я думала от того, что чужой сервер обычно позволяет 2-3 подключения с 1-го IP... имхо
...пока такие выводы...
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.05.2020, 17:46
Цитата Сообщение от JeyCi Посмотреть сообщение
1) кстати, встретилось, что 1 мьютекс на 1 элемент - очень жирно будет, обычно выделяют 1 мьютекс на 10 потоков, насколько поняла, т.е. на 10 элементов...
Мьютексы выделяют не на потоки, а на данные, доступ к которым необходимо синхронизировать
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
28.05.2020, 17:48  [ТС]
9) и в принципе и на cplusplus - есть пример класса (внизу)... хотя в яз. высокого уровня, повторюсь, можно и найти нужные классы... тот же boost... может только если установить отдельно boost_threadpool
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.05.2020, 17:49
Цитата Сообщение от JeyCi Посмотреть сообщение
7) по работе с сокетами (а даже GET в С++ выполняется на открытом сокете - принимающем, - насколько понимаю) - всё равно на сокете может выполняться только 1 процесс -- поэтому неуверена, что параллельность поможет... хотя конкурентность моего тз - может и позволит распараллелить задачу подгрузки и задачу записи в файл... т.е. so named Instruction-Level Parallelism... не Data-Level Parallelism
Поможет - обработка одного запроса и отправка результата не будет тормозить другие запросы
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
28.05.2020, 17:49  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
не на потоки, а на данные, доступ к которым необходимо синхронизировать
спасибо за правку - вобщем 1 к 10 выгоднее, чем 1 к 1...
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.05.2020, 17:53
Цитата Сообщение от JeyCi Посмотреть сообщение
3) убить поток сложно - делать этого не нужно - т.к. проблеиатично освободить ресурсы, позакрывать сокеты и выполнить др. рутину... даже если если поток остановить из др потока
3)хотя boost'овские потоки можно interrupt и они надёжнее, чем std
Не надо его убивать их нужно останавливать штатно и без всяких interrupt
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    volatile bool stop = false;
    std::thread thread([&stop]()
    {
        while (!stop)
        {
            //......................
        }
    });
 
    stop = true;
    thread.join();
}
Добавлено через 1 минуту
Цитата Сообщение от JeyCi Посмотреть сообщение
спасибо за правку - вобщем 1 к 10 выгоднее, чем 1 к 1...
Нет не выгоднее, блокировок будет в 10 раз больше
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
28.05.2020, 17:55  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Поможет - обработка одного запроса и отправка результата не будет тормозить другие запросы
?? в смысле ? - я не отправлять хочу... а получать ответы на запросы... веддь всё равно с моего одного сокета я параллельно не пошлю запросы, только последовательно... а уже прИнятые стринговые переменные для записи в файл - запускать в отдельные потоки для записи... я так пока вижу задачу... имхо... поправьте, если не права

Добавлено через 1 минуту
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Нет не выгоднее, блокировок будет в 10 раз больше
это и имела ввиду 1к1 - если блокировка на каждый элемент - конечно в 10раз больше времени (пусть даже милисекунд), чем если блокировку ставить на пачку в 10шт элементов... вроде логично... в 1к10 меньше lock'ов / unlock'ов по количеству на тот же объём данных/элементов, чем если ставить на каждый (1к1)
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.05.2020, 18:01
Цитата Сообщение от JeyCi Посмотреть сообщение
это и имела ввиду 1к1 - если блокировка на каждый элемент - конечно в 10раз больше, чем если блокировку ставить на пачку в 10шт элементов... вроде логично
Нет не логично. Когда если у тебя один мьютекс на элемент, то ты будешь блокировать только один элемент и потоки будут работать одновременно с разными элементами.
Если ты блокируешь сразу 10 элементов, то эти элементы можно будет обрабатывать только последовательно, т.е. у тебя, грубо говоря, 10 потоков будут стоять и ждать своей очереди

Добавлено через 1 минуту
Цитата Сообщение от JeyCi Посмотреть сообщение
?? в смысле ? - я не отправлять хочу... а получать ответы на запросы... веддь всё равно с моего одного сокета я параллельно не пошлю запросы, только последовательно... а уже прИнятые стринговые переменные для записи в файл - запускать в отдельные потоки для записи... я так пока вижу задачу... имхо... поправьте, если не права
Если у тебя один коннект, то достаточно одного потока. Если два или более- то лучше, если они будут обрабатываться в разных потоках.
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
28.05.2020, 18:03  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Если ты блокируешь сразу 10 элементов... 10 потоков будут стоять и ждать своей очереди
ладно, тогда власть меняется...
в 1к1 они (эти 10 например в целом) ведь всё равно, наверно, не смогут работать параллельно... а только по количеству ядер (например, у меня 2), а оставшиеся 8 из той же 10-ки - будут ждать очередь на ядроо...
и затраты времени на lock/unlock при 1к1 всё равно могут превысить выигрыш от распараллеливания на 2 ядра... имхо
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.05.2020, 18:08
Цитата Сообщение от JeyCi Посмотреть сообщение
в 1к1 они (эти 10 например) ведь всё равно, наверно, не смогут работать параллельно... а только по количеству ядра (например, у меня 2), а оставшиеся из той же 10-ки - будут ждать очередь на ядроо...
и затраты времени на lock/unlock при 1к1 всё равно могут превысить выигрыш от распараллеливания на 2 ядра... имхо
Два смогут работать одновременно. Остальные - в зависимости от того, в чём у тебя заключается обработка - если она содержит ждущие операции, например, чтение файла или отправку по сокетам, то и другие тоже смогут работать одновременно.

Добавлено через 1 минуту
Цитата Сообщение от JeyCi Посмотреть сообщение
и затраты времени на lock/unlock при 1к1 всё равно могут превысить выигрыш от распараллеливания на 2 ядра... имхо
Это если несколько потоков будут блокировать один мьютекс. Чем больше мьютексов, тем меньше вероятность этого

Добавлено через 28 секунд
Цитата Сообщение от JeyCi Посмотреть сообщение
и затраты времени на lock/unlock при 1к1 всё равно могут превысить выигрыш от распараллеливания на 2 ядра... имхо
Это если несколько потоков будут блокировать один мьютекс. Чем больше мьютексов, тем меньше вероятность этого
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
28.05.2020, 18:13  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
отправку по сокетам
нет, там подгрузка с одного сайта...
p.s.
спасибо за ликбез
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.05.2020, 18:15
Цитата Сообщение от JeyCi Посмотреть сообщение
нет, там подгрузка с одного сайта...
Тем более. Пока один поток ждёт эту загрузку, другие будут работать.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
28.05.2020, 18:31  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Пока один поток ждёт эту загрузку, другие будут работать.
надо проверить... отдаст ли сервер (тот чужой) мне инфо, если на него будут колотить мои запросы в таком количестве и с такой скоростью ... не подумает ли чего плохого (даже слово это боюсь произнести вслух - 2 слова - 2-ое "атака")
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.05.2020, 18:33
Цитата Сообщение от JeyCi Посмотреть сообщение
надо проверить... отдаст ли сервер (тот чужой) мне инфо, если на него будут колотить мои запросы в таком количестве и с такой скоростью ... не подумает ли чего плохого
Здесь ты можешь ограничить свои потоки, чтоб не долбили. Например при помощи семафора
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
28.05.2020, 18:59  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
при помощи семафора
? или condition_variable ?
- они ведь вроде взаимозаменяемы... или семафоры имеют какие-то плюса?

Добавлено через 4 минуты
сегодня кстати наталкивалась на семафоры - Simple thread pool... там по линку перейти...
но вроде сейчас в тренде condition_variable ?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.05.2020, 19:03
Цитата Сообщение от JeyCi Посмотреть сообщение
? или condition_variable ?
- они ведь вроде взаимозаменяемы... или семафоры имеют какие-то плюса?
Это вообще разные вещи Semaphore Objects
Хотя, собственно, без разницы, как ты это ограничение реализуешь. Можно с помощью condition_variable, мьютекса и счётчика

Добавлено через 2 минуты
Цитата Сообщение от JeyCi Посмотреть сообщение
но вроде сейчас в тренде condition_variable ?
Без разницы. Делаешь, как тебе удобнее
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
28.05.2020, 20:38  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Можно с помощью... мьютекса
значит:
lock - закрывает поток, чтобы он там в себе что-то выполнял, что в коде;
потом unlock - открывает его для join с основным потоком и выводом, чего надо;
есть ещё:
yield - "говорит планировщику выполнять другие потоки, может использоваться при активном ожидании" (надо разобраться при случае)...
... но в thread_pool - этот yield лишний... т.к. сам pool, насколько понимаю, - очень активно ожидает, выполняя всё остальное в pool'e (все потоки, запущенные в работу)... вообще по количеству в queue - можно и такое количество thread'ов в pool'e открыть?.. циклом... потом также join'ить циклом, видимо?... имхо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.05.2020, 20:38

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

архитектура процессоров и компьютерная архитектура,Intel32. для первокурсников
сабж. кто чем может помочь юному,непонемающему в этой области человеку.желательно книгами.спасибо.

Ошибка "в указанном dsn архитектура драйвера и архитектура приложения"
Вот такая ошибка при нажатии на кнопку "Проверить соединение" Я прочитал, что это возможно из за того, что моя система 64, а...

Архитектура бд
Я начинающий php-разраб. Пишу свой проект для своего города. Но встал вопрос о архитектуре. Пользователь создает свою страницу с...

Архитектура БД
Доброго времени суток.Задание написать АИС Учёт абонентов телефонной сети предприятия. Краткое описание предметной области: В состав...


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

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Новые блоги и статьи
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru