powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как организовать асинхронное чтение данных?
25 сообщений из 26, страница 1 из 2
Как организовать асинхронное чтение данных?
    #39592348
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Классика нам предлагает последовательно выполнить два действия:
1. Считывать порцию данных (строку для текстовых файлов или блок для бинарных файлов).
2 Обработать данные.

А как просто выполнить параллельную эти два действия:
пока я обрабатываю первую порцию данных происходит считывание второй порции,
пока обрабатываю вторую порцию данных происходит считывание третьей...

Есть какие- то простые способы асинхронной работы с I/O в С++?
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39592389
д0кХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlekseySQLКлассика нам предлагает последовательно выполнить два действия:
1. Считывать порцию данных (строку для текстовых файлов или блок для бинарных файлов).
2 Обработать данные.

А как просто выполнить параллельную эти два действия:
пока я обрабатываю первую порцию данных происходит считывание второй порции,
пока обрабатываю вторую порцию данных происходит считывание третьей...

Есть какие- то простые способы асинхронной работы с I/O в С++?
В С++ наверное нет.
Это в операционной системе или архитектуре приложения.
Есть 2 варианта.
1. Использовать соотвествующие системные вызовы и обработку сообщений от ОС.
2. Написать собственный поток для асихронного ввода вывода, который должен
обмениваться сообщениями с основным потоком обработки.
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39592413
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Средствами С++: один поток читает блоками, ставит блоки в очередь, второй поток берет из очереди и обрабатывает.

Можно средствами ОС.
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39592415
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо только понимать, что "просто" - не всегда "быстро" )))
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39592418
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TСредствами С++: один поток читает блоками, ставит блоки в очередь, второй поток берет из очереди и обрабатывает.

Можно средствами ОС.

Вот этого предложения я и боялся :) Даже слово "просто" использовал :)

Тогда надо огород с потоками городить (которые у меня заняты под обработку данных, а переключение контекста- очень плохое решение).
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39592419
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
д0кХ1. Использовать соотвествующие системные вызовы и обработку сообщений от ОС.

Если это платформозависимые решения, то может Qt что-то может предложить? Эти ребята тем и занимаются, что под один интерфейс собирают реализации разных платформ и делают на них риколы.
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39592427
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLЕсли это платформозависимые решения, то может Qt что-то может предложить?

fread() и std::mutex() для организации queue - вполне кроссплатформенны.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39592433
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что- то мне подумалось, что Qt- овский map выполняет то, что мне нужно. По логике он считывает данные по одной странице (4 кб), а потом частями отдает их. Так что наверное решение нашлось :)
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39592462
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLDima TСредствами С++: один поток читает блоками, ставит блоки в очередь, второй поток берет из очереди и обрабатывает.

Можно средствами ОС.

Вот этого предложения я и боялся :) Даже слово "просто" использовал :)

Тогда надо огород с потоками городить (которые у меня заняты под обработку данных, а переключение контекста- очень плохое решение).
Собственно это ОС и сделает если средства ОС задействуешь.

Переключение контекста ты неправильно понимаешь.
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39592471
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLЧто- то мне подумалось, что Qt- овский map выполняет то, что мне нужно. По логике он считывает данные по одной странице (4 кб), а потом частями отдает их. Так что наверное решение нашлось :)
Да, это описанная тобой классика, это последовательная обработка: обратился к новой странице - пауза на считывание этой страницы с диска, т.е. как ты написал
AlekseySQL1. Считывать порцию данных (строку для текстовых файлов или блок для бинарных файлов).
2 Обработать данные.
Проецирование в память не приводит к считыванию с диска всего что проецируешь. Читается по мере необходимости.

Если хочешь опережающее чтение, то в средствах ОС есть спец.флаги при открытии файла, которые указывают что чтение будет всего файла и последовательно. В этих случаях ОС делает упреждающее чтение, т.е. ты прочитал кусок файла, пока обрабатываешь - ОС прочитала в кэш следующий кусок, когда ты его попросишь - ОС просто скопирует его к тебе из кэша.
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39592561
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно сравнить сколько код для синхронного чтения и обработки файла (если не определено ASYNCIO), и для асинхронного (если определено ASYNCIO):

Код: plaintext
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.
63.
64.
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <thread>
#include <atomic>
#include <condition_variable>
#include <algorithm>

#define ASYNCIO

int main(int argc, char *argv[]) 
{
	std::string filename = (argc > 1) ? argv[1] : "test.mp4";

	std::ifstream infile(filename.c_str(), std::ios::in | std::ios::binary | std::ios::ate);
	if (infile.is_open()) {
		size_t in_file_size = static_cast<size_t>(infile.tellg());
		std::cout << "file: " << filename << " - is opened, size = " << in_file_size << " \n";
		std::vector<char> data_array(in_file_size);
		infile.seekg(0, std::ios::beg);
		std::atomic<size_t> read_pos(0);
#ifndef ASYNCIO
		infile.read(data_array.data(), in_file_size);
		read_pos = in_file_size;
		for (size_t i = 0; i < in_file_size; ++i)
			data_array[i] = data_array[i] * 2;	// process data
#else
		size_t const read_by_size = 1024 * 1024;	// 1 MB
		std::condition_variable cv_read;
		std::mutex mtx_read;
		std::thread t_read_file([&]() {
			while (read_pos < in_file_size) {
				size_t current_read_bytes = std::min(read_by_size, (size_t)in_file_size - read_pos);
				infile.read(data_array.data(), current_read_bytes);
				read_pos += current_read_bytes;
				cv_read.notify_all();
			}
			std::cout << "thread read ended \n";
		});
		size_t current_pos;
		for (current_pos = 0; current_pos < in_file_size;) {
			size_t tmp_read_pos = read_pos;
			if (tmp_read_pos > current_pos) {
				for (size_t i = current_pos; i < tmp_read_pos; ++i) {
					data_array[i] = data_array[i] * 2;	// process data
				}
			}
			else {
				for (std::unique_lock<std::mutex> lock(mtx_read); read_pos <= current_pos; cv_read.wait(lock));
			}
			current_pos = tmp_read_pos;
		}
		t_read_file.join();
		std::cout << "current_pos = " << current_pos << " \n";
#endif
		std::cout << "read_pos = " << read_pos << " \n";
	}	

	std::cout << "OK \n";
	getchar();

	return 0;
}
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39593622
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLКлассика нам предлагает последовательно выполнить два действия:
1. Считывать порцию данных (строку для текстовых файлов или блок для бинарных файлов).
2 Обработать данные.

А как просто выполнить параллельную эти два действия:
пока я обрабатываю первую порцию данных происходит считывание второй порции,
пока обрабатываю вторую порцию данных происходит считывание третьей...

Есть какие- то простые способы асинхронной работы с I/O в С++?
на винде I/O Completion Ports , вроде несложно, хотя это понятие относительное

кросс-платформенно - asio например, но тоже не без телодвижений
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39596066
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Оказалось, что ничего этого не нужно: система работает через буферы, которые и берут на себя задачу непрерывной подачи данных.

Я сделал замеры когда на моем SSD были ФС ext4 и ntfs. В последнем случае сильно упала скорость чтения файла, но общая скорость работы программы практически сохранилась (привожу средние значения):
Чтение ext4: 22,5 сек
Чтение ntfs: 38 сек
Чтение + Выполнение ext4: 65 сек
Чтение + Выполнение ntfs: 66,5 сек

По результатам видно, что падение скорости выполнения всей программы значительно меньше, чем падение скорости чисто файлового чтения. Так что отбой: умные дяденьки этот вопрос уже обдумали и дали нам готовое решение.
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39596075
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL, системные буферы не безразмерны.

Используй перекрытый ввод-вывод .
Если надеешься на буферизацию при записи, то, как минимум, во время обработки очередного блока можешь запросить чтение следующего блока.
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39596166
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччДкак минимум, во время обработки очередного блока можешь запросить чтение следующего блока.

Это делает контроллер диска без каких- либо дополнительных телодвижений исполняемой программы.
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39596220
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLчччДкак минимум, во время обработки очередного блока можешь запросить чтение следующего блока.

Это делает контроллер диска без каких- либо дополнительных телодвижений исполняемой программы.

AlekseySQLЯ сделал замеры когда на моем SSD
а чем отличается SSD от HDD помнишь или уже забыл?
и как работает HDD в конкурентной среде тоже помнишь?

двухфазный буфер это как бы основа, ты предупреждаешь ОС о том что тебе понадобятся ещё данные и она может планировать хотелки от всех программ
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39596414
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLЯ сделал замеры когда на моем SSD были ФС ext4 и ntfs. В последнем случае сильно упала скорость чтения файла
Ожидаемо. Линукс не заточен под ФС виндовса.
AlekseySQLчччДкак минимум, во время обработки очередного блока можешь запросить чтение следующего блока.

Это делает контроллер диска без каких- либо дополнительных телодвижений исполняемой программы.
Наивное заблуждение. Контроллер не знает где следующий блок. ОС знает, но тоже не торопится читать следующий, т.к. файлы редко читаются последовательно.
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39596421
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TНаивное заблуждение. Контроллер не знает где следующий блок. ОС знает, но тоже не торопится читать следующий, т.к. файлы редко читаются последовательно.

Думаю, что следующий блок идет сразу за текущим:)
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39596424
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T т.к. файлы редко читаются последовательно.

Сейчас достаточно крупные жесткие диски, поэтому практически нет фрагментации файлов, поэтому в основном файлы читаются последовательно.
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39596439
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На SSD фрагментация никак не мешает. С SSD можно одинаково быстро прочитать сектор из любого места диска.

Дефрагментация нужна была на HDD, т.к. там последовательно читать быстрее, поэтому исторически ФС заточены на последовательную запись. Отчасти ты прав: ОС старается писать файл последовательно, но нынче это уже не нужно.
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39596441
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLDima T т.к. файлы редко читаются последовательно.

Сейчас достаточно крупные жесткие диски, поэтому практически нет фрагментации файлов, поэтому в основном файлы читаются последовательно.
Я хотел сказать что редко требуется прочитать файл от начала до конца. Гораздо чаше нужно чтение кусков из разных мест.
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39596443
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLчччДкак минимум, во время обработки очередного блока можешь запросить чтение следующего блока.

Это делает контроллер диска без каких- либо дополнительных телодвижений исполняемой программы.

Ты сам так решил или прочитал где-нибудь? Может, тестировал, сравнивал с перекрытым вводом-выводом?
Расскажи, пожалуйста.
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39596450
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TНа SSD фрагментация никак не мешает. С SSD можно одинаково быстро прочитать сектор из любого места диска.

Не соглашусь: есть программы показывающие скорость записи / чтения для дисков (например, CristalDiskMark). Так вот на SSD для непрерывных потоков они показывают значительно лучшие результаты, чем на операциях чтениях / записи кусками по 4, 8, 16... кБ. Так что непрерывность расположения данных SSD также важна.
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39596452
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чччДТы сам так решил или прочитал где-нибудь? Может, тестировал, сравнивал с перекрытым вводом-выводом?
Расскажи, пожалуйста.

Читал об этом много раз. Собственно если бы этой функции не было, то кеш HDD- диску был бы не нужен.
Насчет тестов: для этого можно использовать программы типа CrystalDiskMark, которые показывают хорошие результаты для непрерывных операций именно за счет дополнительных асинхронных действий, выполняемых контроллером диска (опережающее чтение и "объединенная" запись).
...
Рейтинг: 0 / 0
Как организовать асинхронное чтение данных?
    #39596466
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно взять HD-Tune и погонять бенчмарки на SSD диске и раз и навсегда в данном топике
поставить точку в этом вопросе.

Стоимость IOps-а у него другая. Но это еще не дает нам основания говорить что SSD всегда
будет хорош на произвольном доступе. Возможно у него есть другие артефакты которые
также имеют значение.

Ну. Кто счастливый обладатель SSD?
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как организовать асинхронное чтение данных?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]