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

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

11.03.2020, 10:51. Показов 32632. Ответов 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
Ответ Создать тему
Новые блоги и статьи
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru