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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если хочешь опережающее чтение, то в средствах ОС есть спец.флаги при открытии файла, которые указывают что чтение будет всего файла и последовательно. В этих случаях ОС делает упреждающее чтение, т.е. ты прочитал кусок файла, пока обрабатываешь - ОС прочитала в кэш следующий кусок, когда ты его попросишь - ОС просто скопирует его к тебе из кэша.
...
Рейтинг: 0 / 0
29.01.2018, 03:10
    #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
30.01.2018, 22:41
    #39593622
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как организовать асинхронное чтение данных?
AlekseySQLКлассика нам предлагает последовательно выполнить два действия:
1. Считывать порцию данных (строку для текстовых файлов или блок для бинарных файлов).
2 Обработать данные.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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