Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2017, 03:44   #1
_Osaka
Пользователь
 
Регистрация: 04.10.2012
Сообщений: 38
По умолчанию Читать много файлов по несколько байт win32

Есть папка в ней много файлов. Файлы не больше 8 байт. Надо их читать и делать небольшие вычисления. Как это лучше делать?
Наверно лучше под каждый файл выделять поток. Т.к. параллельно чтение файлов лучше последовательного (контроллер диска полечат сразу много команд на чтение и имеет возможность их оптимизировать, а не простаивает). Однако количество потоков ограничено. Потому придётся использовать всё тоже самое но в пуле потоков.
Может я где-то не прав? Может придумываю костили? Какие у вас идеи?
_Osaka вне форума Ответить с цитированием
Старый 10.02.2017, 08:44   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Лучше слить их в один файл, загрузить его весь в память и обращаться к маленьким частям прочитанного файла как к целому исходному файлу.
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 10.02.2017, 09:20   #3
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Слить в один файл так, как время открытия файла достаточно велико. 0,1-0,3 с.

Цитата:
(контроллер диска полечат сразу много команд на чтение и имеет возможность их оптимизировать, а не простаивает
Это даже маркетологи не подтверждают.
Лучше один поток на чтение он будет работать быстрее.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 10.02.2017, 12:04   #4
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Наверно лучше под каждый файл выделять поток. Т.к. параллельно чтение файлов лучше последовательного
А у жесткого диска двигателей тоже несколько,
чтобы работать параллельно?
Ничего кроме "забивания" ввода/вывода Вы этим не добьетесь.
А если еще и файлов много и на каждый отдельный поток,
то еще и затормозите свою программу.
Больше потоков - не значит лучше.
Croessmah вне форума Ответить с цитированием
Старый 11.02.2017, 22:49   #5
_Osaka
Пользователь
 
Регистрация: 04.10.2012
Сообщений: 38
По умолчанию

А на уровне операционной системы нет такой оптимизации?
_Osaka вне форума Ответить с цитированием
Старый 11.02.2017, 22:54   #6
_Osaka
Пользователь
 
Регистрация: 04.10.2012
Сообщений: 38
По умолчанию

Мне просто дали такое задание:
На компьютере существует папка с файлами. Файлов много, их имена заранее неизвестны, в каждом файле записано целое число (необходима дополнительная проверка на корректность содержимого файла).
Нужно написать консольное приложение win32, которое принимает на вход путь к папке и обрабатывает файлы следующим образом:

Для каждого файла нужно выполнить следующий порядок действий:
1. прочитать из файла число
2. сразу же, после получения числа, нужно вывести его и имя файла в stdout, например:
o.txt: 3
3. после этого необходимо усыпить текущий поток на 1 секунду

После обработки всех файлов необходимо сообщить пользователю сумму всех чисел.
Дополнительные условия:
- программу следует писать в IDE Microsoft Visual Studio
- будет преимуществом использование библиотеки Boost
- программа должна обрабатывать файлы параллельно

Как его лучше сделать? Сделал каждый файл в своем потоке.
Может надо в пуле потоков? Каким лучше сделать размер пула?
_Osaka вне форума Ответить с цитированием
Старый 12.02.2017, 06:18   #7
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
2. сразу же, после получения числа, нужно вывести его и имя файла в stdout, например:
o.txt: 3
3. после этого необходимо усыпить текущий поток на 1 секунду
Эти два требования убивают любую оптимизацию.
При их наличии можно что угодно писать,
программа всё равно будет тормозом.
Цитата:
Как его лучше сделать?
directory_iterator (recursive_directory_iterator) + std::async + std:: packaged_task, например.
Croessmah вне форума Ответить с цитированием
Старый 12.02.2017, 09:09   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Если надо показывать файл за файлом, да еще с интервалом, тогда я не понимаю, зачем это делать параллельно, либо условие недосказано и там написано "параллельно чему-то там".
waleri вне форума Ответить с цитированием
Старый 12.02.2017, 16:57   #9
_Osaka
Пользователь
 
Регистрация: 04.10.2012
Сообщений: 38
По умолчанию

Это полость тест задания.
_Osaka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в Visio C++ win32 проекте создать динамический текст и читать из него информацию Krasi Помощь студентам 0 08.10.2015 09:40
asm вставка, прошу помощи (1 байт воспринимается как много, кириллический символ) stslam C++ Builder 19 24.01.2014 11:55
как можно читать файл несколько раз??? Shahzod Общие вопросы C/C++ 2 14.12.2013 13:28
Как читать атрибуты с файлов? eks-s Общие вопросы Delphi 2 16.01.2008 02:25
Что делать..:(((много читать)Global problem! Elm0 Свободное общение 24 28.06.2007 18:13