WedX - журнал о программировании и компьютерных науках

Сохранение потока данных в файле hdf5 с использованием Python

У меня есть программа на Python, которая принимает поток данных через UDP со скоростью + - 1000 Гц. Типичный стрим занимает + - 15 минут. Он состоит из + - 10 каналов, каждый из которых состоит из потока двойных, логических значений или вектора размера 3 с меткой времени.

В настоящее время каждая итерация (то есть 1000 раз в секунду) записывает строку в файл csv со всеми значениями.

Чтобы ограничить размер файлов, я хочу изменить формат на hdf5 и записать данные с помощью h5py.

Очень коротко, это должно выглядеть так:

class StoreData(threading.Thread):

    def __init__(self):
        super().__init__()
        self.f = open_hdf5_file_as_write()

    def run(self):
        while True:
            # return True every +- 0.001 seconds
            if self.new_values_available():
                vals = self.get_new_vals()
                # What to do best with the vals here?

Но я натыкаюсь на 2 вопроса.

  1. Какая лучшая структура файла HDF5? Лучше всего хранить потоки в разных группах или просто разные наборы данных в одной группе?

  2. Как мне записать данные? Могу ли я на каждой итерации расширять наборы данных с помощью 1 переменной с помощью изменения размера? Должен ли я хранить данные локально и обновлять каждые n итераций фрагментом из n значений на поток, или я сохраняю все в таблице pandas и записываю ее только один раз в конце?

Ответ на 1 из 2 вопросов уже будет большим подспорьем!

23.03.2021

Ответы:


1

Оба хороших вопроса. Я не могу дать точный ответ, не зная больше о ваших данных и рабочих процессах. (Примечание: Группа HDF имеет хороший обзор, который вы, возможно, захотите просмотреть здесь: Введение в HDF5. Это хорошее место для изучения возможностей проектирования схемы.) Вот вещи, которые я хотел бы рассмотреть в ходе мысленного эксперимента:

Лучшая структура:
С HDF5 вы можете определить любую схему по вашему желанию (в определенных пределах), поэтому лучшая структура (схема) - это та, которая лучше всего работает с вашими данными и процессами.

  • Поскольку у вас есть существующий формат файла CSV, самым простым подходом является создание эквивалентного типа NumPy dtype и обращение к нему для создания повторного массива, содержащего данные. Это имитирует вашу текущую организацию данных. Если вы хотите стать более привлекательным, вот и другие соображения:
  • Ваши типы данных: однородны ли они (все числа с плавающей запятой или все целые числа) или неоднородны (смесь чисел с плавающей запятой, целых чисел и строк)? У вас будет больше вариантов, если они все одинаковы. Однако HDF5 также поддерживает смешанные типы как составные данные.
  • Организация: Как вы собираетесь использовать данные? Правильно составленная схема поможет избежать гимнастики данных в будущем. Выгодно ли (для вас) сохранять все в одном наборе данных или распределять по разным наборам данных / группам? Подумайте о данных, организованных в папках и файлах на вашем компьютере. Группы HDF5 - это ваши папки, а наборы данных - это ваши файлы.
  • Удобство работы с данными: аналогично организации. Насколько легко / сложно писать или читать. Возможно, будет проще написать его сразу после того, как вы его получите, но удобен ли этот формат, когда вы хотите его обрабатывать?

Как мне записывать данные?
Существует несколько пакетов Python, которые могут записывать данные HDF5. Я знаком с PyTables (также известными как таблицы) и h5py. (Pandas также может создавать файлы HDF5, но у меня нет опыта, которым можно поделиться.) Оба пакета имеют схожие возможности и некоторые различия. Оба поддерживают необходимые вам функции HDF5 (наборы данных с изменяемым размером, однородные и / или разнородные данные). h5py пытается максимально точно сопоставить набор функций HDF5 с NumPy. PyTables имеет уровень абстракции поверх HDF5 и NumPy с расширенными возможностями индексирования для быстрого выполнения запросов к данным в ядре. (Кроме того, я обнаружил, что ввод-вывод PyTables немного быстрее, чем h5py.) По этим причинам я предпочитаю PyTables, но мне одинаково комфортно и с h5py.

Как часто мне следует писать: каждые 1 или N итераций или один раз в конце?
Это компромисс между доступной оперативной памятью, требуемой производительностью ввода-вывода и сложностью кодирования. Каждая запись в файл требует затрат времени ввода-вывода. Итак, самый быстрый процесс - сохранить все данные в ОЗУ и записать в конце. Это означает, что вам нужно достаточно памяти для хранения 15-минутного потока данных. Я подозреваю, что это решение будет зависеть от требований к памяти. Хорошие новости: PyTables и h5py будут поддерживать любой из этих методов.

23.03.2021
Новые материалы

Как создать диаграмму градиентной кисти с помощью D3.js
Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


Для любых предложений по сайту: [email protected]