У меня есть куча файлов (порядка 10 в секунду), поступающих в систему (хранящихся в базе данных).Каждый файл содержит запись от 1 до 500 устройств.Данное устройство будет отображаться в нескольких файлах (но не в каждом файле).Эти данные в конечном счете должны быть сохранены в другой базе данных, сохраненной для каждого устройства.Существует два разных формата файлов.
Существует API, который заботится о конечной части базы данных, которая принимает несколько записей для одного устройства (за кулисами также выполняется поиск для поиска идентификаторов в базе данных).и, таким образом, обработка нескольких записей одновременно для одного устройства означает выполнение поиска один раз, а не один раз для каждой записи).
Для этого у меня есть программа, состоящая из нескольких частей:
- Анализ файлов, извлечение данных в общий набор объектов данных.
- Это многопоточный процесс с одним потоком на файл, добавляющий данные в потокобезопасную коллекцию.
- По мере загрузки каждого файла его запись в БД помечается как «в процессе»
- Сохранение объектов в базе данных
- Еще один многопоточный процесс, который извлекает все объекты для данного устройства, а затем сообщает API данных о необходимости их сохранения.
- После успешного сохранения всех устройств из одного файла (или при сбое) запись в БД для исходного файла помечается как успешная / неудачная
Мой вопрос таков: как лучше всего управлять, когда анализировать файлы, сколько потоков использовать, сколько оперативной памяти и т. Д.?
- API данных займет больше всего времени - большинство извремя, потоки там будут просто ждать возврата API.
- Общая эффективность системы повышается за счет увеличения количества данных, сгруппированных на устройство.
- Приложение не должно исчерпать ОЗУ или иметь так много файлов, которые анализируются, но ожидают сохранения, чтобы сохранить его.вызывает обмен ОС.
- Неизвестно, сколько одновременных вызовов может обрабатывать API БД, или как быстро он выполняется - этот процесс должен адаптироваться к этому
Так как мнезнаете, когда анализировать файлы, чтобы убедиться, что это происходит настолько быстро, насколько это возможно, без снижения производительности при использовании слишком большого объема ОЗУ?