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

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

11.03.2020, 10:51. Показов 35434. Ответов 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,554
13.07.2020, 21:12  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
они не будут стоять в очереди на ядро
предлагаю внести ясность в смысл работы ядер:
насколько я понимаю, через ядра проходят вызов функций и параметры функций... остальное можно крутить в куче... правильно ли я понимаю?

Добавлено через 3 минуты
а методы классов?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
14.07.2020, 11:43
Цитата Сообщение от DrOffset Посмотреть сообщение
Зачем их заводить больше, чем есть ядер? Особенно 500.
Кстати, протестировал std::async и свои пулы потоков {1, 500} и {std::thread::hardware_concurrency(), 0}, где std::thread::hardware_concurrency() = 8.
1млн раз запускается сортировка массива из 10 элементов.
{1, 500} и std::async отрабатывают примерно одинаково и в 2-3 раза быстрее, чем {8, 0}, в котором новые потоки не создаются.
В одном потоке, работает в 4 раза медленнее, чем {1, 500} и std::async (немного для 8 ядер, но накладных расходов в пулах потоков, всё-таки дофига).
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
14.07.2020, 12:23
oleg-m1973, для std::async нет гарантии, что внутри будет обязательно пул потоков. Надо смотреть конкретную реализацию.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
14.07.2020, 12:55
Цитата Сообщение от DrOffset Посмотреть сообщение
oleg-m1973, для std::async нет гарантии, что внутри будет обязательно пул потоков. Надо смотреть конкретную реализацию.
Ну, я готов поспорить, что в майкрософте std::async реализован при помощи пула потоков, который создаётся для процесса по-умолчанию. Да и речь шла не об std::async.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
14.07.2020, 13:18
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ну, я готов поспорить, что в майкрософте std::async реализован при помощи пула потоков
Спорить нет смысла.
Я просто уточнил, что за std:;async не гарантируется пула потоков, поэтому на каком-то компиляторе твои выводы насчет него окажется нельзя использовать.

Добавлено через 16 минут
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
{1, 500} и std::async отрабатывают примерно одинаково и в 2-3 раза быстрее, чем {8, 0}, в котором новые потоки не создаются.
А код всего этого бенча можно где-то посмотреть?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
14.07.2020, 13:22
DrOffset, я имел ввиду, что для того чтобы один поток на ядро дал преимущество, алгоритм надо специально организовывать в расчёте на такое исполнение. В пуле же потоков выполняются обычные задачи, ни под что не оптимизированные, поэтому на пуле c одним постоянным потоком и пятьюстами временными они выполняются в разы быстрее, чем на нескольких фиксированных потоках.
У меня в потоке для теста запускалась вот такая функция, безо всяких блокировок
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
size_t TaskProc()
{
    double data[_data_sz];
    std::copy(_data.begin(), _data.end(), data);
    std::sort(std::begin(data), std::end(data));
 
    //std::this_thread::sleep_for(1ms);
    const size_t n = --_nnn;
    if (!n)
        _sync.notify_all();
 
    return n;
}
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
14.07.2020, 13:25
oleg-m1973, я не об этом. Пул потоков может быть организован и на фиксированном количестве единожды созданных потоков - это вопрос реализации.

Я пока что просто спросил есть ли возможность дать посмотреть код, которым эта функция запускалась, или нет.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
14.07.2020, 13:26
Цитата Сообщение от DrOffset Посмотреть сообщение
А код всего этого бенча можно где-то посмотреть?
У меня там, к сожалению, слишком много кода, целая библиотека, замучаешься из него делать пример
Вот так запускаю для std::async
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
static std::atomic<size_t> _nnn{0};
static Sys::CThreadSync _sync;
 
static const size_t _data_sz = 1000;
static std::vector<double> _data(_data_sz);
 
............................
 
static const size_t _n = 1000000;
.....................
std::vector<std::future<size_t>> futs;
..............
        _nnn = _n;
        futs.clear();
        futs.reserve(_n);
 
        auto dt2 = CTimer::Measure([&]()
        {
            const auto dt = CTimer::Measure([&]()
            {
                for (size_t i = 0; i < _n; ++i)
                    futs.emplace_back(std::async(TaskProc));
            });
 
            //for (auto &item: futs)
            //  item.get();
            std::unique_lock lock(*_sync);
            _sync.wait(lock);
 
            return dt;
        });
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
14.07.2020, 13:32
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
У меня там, к сожалению, слишком много кода, целая библиотека, замучаешься из него делать пример
Понятно, ну ладно.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
14.07.2020, 20:53  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
для std::async нет гарантии, что внутри будет обязательно пул потоков. Надо смотреть конкретную реализацию.
встречался мне хороший пример - до сих пор помню название - Синхронная асинхронность - там даже о синхронности не пришлось говорить сначала... но и пула там пока ещё, мне кажется, нет (в асинхр. варианте)?...
запускать с std::vector<std::future<void>> futures, видимо, стоит пробовать для асинхронности?...
а прямой путь к пулу потоков всё-таки, думаю, в этом:
The documentation states that launch::deferred will invoke the function on the calling thread, while launch::async will invoke the function on a new thread.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
14.07.2020, 21:06
Цитата Сообщение от DrOffset Посмотреть сообщение
Понятно, ну ладно.
Ну да, понятно. Естественно, нашёл у себя просёр. Который особо не проявлялся на {1, 500}, но проявился на {8, 0}. После исправления, заработало примерно одинаково.
Проблема была в дополнительном потоке, который в случае, если очередь задач не пустая и нет свободных потоков, запускает новый рабочий поток.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
14.07.2020, 22:35  [ТС]
справилась с SocketWaitEvent...
но всё-таки уточню перед тем, как внедрять в весь проект... - мне кажется, что SaveFile тоже операция блокирующая IO ?? - ведь HDD-пространство - общее - понимаю так... правильно ли понимаю?.. потому что сохраняются файлы всё равно последовательно др. за др., хоть и вываливаются в list GUI все сразу (тестово 10 штук)
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.07.2020, 22:53
Вроде как файл могу сохранятся за один проход если файл будут лежать рядом в близких секторах.
Т.е. там своя очередь что которая оптимизирует работу HDD. Так что думаю смысл есть делать асинхронным, а на деле нужно проверять.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
15.07.2020, 10:48  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Т.е. там своя очередь что которая оптимизирует работу HDD.
значит всё-таки очередь... да и логично - ведь receiving responseS через тот несчастный наш 1 сокет даже при асинхронном выполнении multiRequests будет выполнять последовательно, когда освободиться от send или receive предыдущего response'а и т.д. - пошлёт друг за дружкой, потом вернёт друг за другом... и всё через условно говоря "переключение контекстов" фаз работы сокета по отсылке запросов и принятию ответов...
наверно, выбрасывается в list - быстро, т.к. нет тормозов... а подгружается последовательно - это время на переключение контекста работы сокета... имхо...
вобщем благодарю всех - справились одним махом... даже без очередной ветки
===
а вообще открыла кн. Холлингворта по Borland'у - в принципе во всех этих многопоточных сложностях всего 3 этапа (на примере мьютекса):
- CreateMutex
- WaitForSingleObject
- ReleaseMutex
= вот 2-й этап в природе действует, судя по всему, также, как наш сокет на физическом уровне... т.е. ожидающе
===

осталось AtomicRead и AtomicWrite в U++ обкатать...
и совет, встречавшийся, переварить: "нужна Двойная защита при использовании потоков - надо защищать и общие переменные (через atomic или мьютексы и т.д.) и read-write memory barriers расставлять (RWLocks in u++), где надо...
===
логика, правда на C#:
memory barriers
Для исключения перестановки инструкций чтения вполне достаточно воспользоваться volatile read при чтении _a.
Nonblocking Synchronization
All of Interlocked’s methods generate a full (write & read) fence.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
15.07.2020, 11:32
Цитата Сообщение от JeyCi Посмотреть сообщение
логика, правда на C#:
memory barriers
Для исключения перестановки инструкций чтения вполне достаточно воспользоваться volatile read при чтении _a.
Не надо смотреть логику на си-шарпе, там она какая-то своя. В с++ volatile гарантирует, что компилятор не будет оптимизировать переменную, но для процессора это не указ. Надо использовать std::atomic или interlocked-функции.
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
15.07.2020, 11:53  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Надо использовать std::atomic или interlocked-функции.
всё - заметила:
But it's nothing difficult! Mutexes, Write Read Barriers by atomic. Every Thread interchange vars - volatile.
думала, надо и то (atomic), и то(rw-locks)... а оказывается, atomic (~rw-lock) для процессора, а volatile для компилятора... действительно, двойная защита
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.07.2020, 13:05
Цитата Сообщение от JeyCi Посмотреть сообщение
значит всё-таки очередь... да и логично - ведь receiving responseS через тот несчастный наш 1 сокет даже при асинхронном выполнении multiRequests будет выполнять последовательно,
Смысл Вам отвечать если Вы не вдумываетесь в то что Вам отвечают и городите свою чушь.

Добавлено через 2 минуты
Цитата Сообщение от JeyCi Посмотреть сообщение
думала, надо и то (atomic), и то(rw-locks)... а оказывается, atomic (~rw-lock) для процессора, а volatile для компилятора... действительно, двойная защита
Наверное Вам хотели сказать что не стоит в С++ использовать volatile и полагаться на него.

Добавлено через 3 минуты
Насчет HDD я просто оставлю это тут https://1cloud.ru/blog/proizvoditelnost-diskov .
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
15.07.2020, 17:02  [ТС]

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
Смысл Вам отвечать если Вы не вдумываетесь в то что Вам отвечают и городите свою чушь.
а такие ответы никому не нужны... даже линки искать/оставлять не буду о том, сколько раз вы хлопали дверями, посылая всех, порываясь уйти, причём на разных ветках, - просто будьте последовательны в своём негативе и исполняйте принятые вами решения... без ваших психов - чуши всегда будет меньше в теме, и диалог чище... даже логически...

Цитата Сообщение от Avazart Посмотреть сообщение
Наверное Вам хотели сказать
да сказали уже давно - вам забыли повторить? вы опять не успели прочитать? - даже линк оставляля несколько страниц назад... пост от Mon, 24 August 2015


Добавлено через 12 минут
суть сомнений по HDD была лишь в том - сначала резервируется место на диске под запись, а потом туда пишется инфо ИЛИ сначала просто создаётся handler на новый файл (CreateFile) и системе не важно, сколько в этот файл зальют инфо... лишь точно зная по 1-му или 2-му сценарию идёт запись в файл (и мне даже кажется, что по 2-му) - можно не думать лишнего о том "чтобы не конфликтовали" данные из разных потоков при записи на hdd... имхо

Добавлено через 58 минут
===
а про барьеры:
Memory Barriers
Барьеры памяти
(чтобы код подчистить, где надо, - чтобы потом не нарваться на неожиданности)

Добавлено через 16 минут
и пример кода, где всё-таки удаётся достичь выигрыша по скорости соразмерно количеству ядер (если верить автору или проверить)
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554
16.07.2020, 08:24  [ТС]
Цитата Сообщение от JeyCi Посмотреть сообщение
- справились одним махом... даже без очередной ветки
не совсем...
значит есть над чем работать ...
Цитата Сообщение от JeyCi Посмотреть сообщение
потому что сохраняются файлы всё равно последовательно др. за др., хоть и вываливаются в list GUI все сразу (тестово 10 штук)
присмотрелась к коду - очередь на выходе из всех http.Do() собирается циклом... а может и - ожидание на сокете даёт о себе знать?... или отсутствие истинного переключения контекста в коде подгрузки?.. хотя скорее всего НЕиспользование async-read/async_write!.. имхо... - отсюда и последовательное вываливание файлов в папку назначения...
запустила код на Python - с async-await и aiohttp - там файлы вываливаются все в папку назначения и по скорости выигрывают - значит есть над чем работать ...
но это уже др. тема
т.к. идём по 2-му кругу, начиная с #174
Qt не предлагать, т.к. When will async/await pattern appear in QT?

в С++20 coroutines уже перешли из boost -- просто поставить MSVC компилятор (с его ассемблеровсой частью ml.exe)
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.07.2020, 12:55
async/await pattern как бы не определяют асинхронность это лишь дизайн.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.07.2020, 12:55

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
380
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru