Сохранение больших массивов Python на диск для повторного использования позже hdf5? Какой-то другой метод?

В настоящее время я переписываю некоторый код Python, чтобы сделать его более эффективным, и у меня есть вопрос о сохранении массивов Python, чтобы их можно было повторно использовать/манипулировать позже.

У меня есть большое количество данных, сохраненных в файлах CSV. Каждый файл содержит значения интересующих меня данных с отметками времени, и я достиг точки, когда мне приходится иметь дело с десятками миллионов точек данных. Данные стали настолько большими, что время обработки стало чрезмерным и неэффективным — способ написания текущего кода требует повторной обработки всего набора данных каждый раз, когда добавляются новые данные.

Я хочу сделать следующее:

  1. Считайте все существующие данные в массивы python
  2. Сохраните массивы переменных в какой-либо базе данных/файле.
  3. Затем, когда в следующий раз добавляются новые данные, я загружаю свою базу данных, добавляю новые данные и сохраняю их заново. Таким образом, в любой момент времени необходимо обрабатывать только небольшое количество данных.
  4. Я хотел бы, чтобы сохраненные данные были доступны для других сценариев Python, но также были достаточно «читаемы человеком», чтобы их можно было обрабатывать в таких программах, как OriginPro или, возможно, даже в Excel.

У меня вопрос: в каком формате лучше сохранять данные? Кажется, HDF5 может иметь все функции, которые мне нужны, но будет ли что-то вроде SQLite иметь больше смысла?

РЕДАКТИРОВАТЬ: Мои данные одномерны. По сути, у меня есть 30 массивов размером (миллионы, 1). Если бы не то, что точек так много, то CSV был бы идеальным форматом! Я вряд ли захочу выполнять поиск отдельных записей --- более вероятно, что я захочу построить небольшие подмножества данных (например, последние 100 часов или последние 1000 часов и т. д.).


person FakeDIY    schedule 29.05.2012    source источник
comment
Не могли бы вы предоставить более конкретную информацию по вашей проблеме? Например, в скольких измерениях находятся данные. Вы имеете дело со многими массивами с небольшим количеством элементов в каждом или с небольшим количеством массивов с большим количеством элементов? Как вы думаете, вам нужно будет выполнять сложные запросы к этим данным? Если ваши данные многомерны и вы могли бы извлечь выгоду из запросов, SQLite может иметь смысл.   -  person Mike Vella    schedule 29.05.2012
comment
Я добавил некоторую информацию по запросу. По сути, у меня есть небольшое количество одномерных массивов, но каждый массив имеет ~ миллионы элементов.   -  person FakeDIY    schedule 29.05.2012


Ответы (3)


HDF5 — отличный выбор! Он имеет приятный интерфейс, широко используется (по крайней мере, в научном сообществе), многие программы поддерживают его (например, Matlab), есть библиотеки для C, C++, fortran, python,... Он имеет полный набор инструментов. для отображения содержимого файла HDF5. Если вы позже захотите выполнить сложный расчет MPI для своих данных, HDF5 поддерживает одновременное чтение/запись. Он очень хорошо подходит для обработки очень больших наборов данных.

person wpoely86    schedule 30.05.2012
comment
Кажется, что вариантов довольно много, но я выберу HDF5 по указанным вами причинам :-) - person FakeDIY; 30.05.2012

Возможно, вы могли бы использовать какую-то базу данных типа «ключ-значение», например Redis, Berkeley DB, MongoDB... Но было бы неплохо получить дополнительную информацию о схеме, которую вы будете использовать.

ОТРЕДАКТИРОВАНО

Если вы выберете, например, Redis, вы сможете индексировать очень длинные списки:

Максимальная длина списка составляет 232 - 1 элемент (4 294 967 295, более 4 миллиардов элементов в списке). Основными особенностями списков Redis с точки зрения временной сложности являются поддержка постоянной вставки и удаления элементов рядом с головой и хвостом, даже при наличии многих миллионов вставленных элементов. Доступ к элементам очень быстр вблизи краев списка, но медленный, если вы пытаетесь получить доступ к середине очень большого списка, так как это операция O (N).

person Diego Navarro    schedule 29.05.2012

Я бы использовал один файл с фиксированной длиной записи для этого варианта использования. Никакого специализированного решения для БД (в этом случае мне это кажется излишним), просто старый добрый struct (см. документацию для struct.py) и read()/write() в файле. Если у вас есть только миллионы записей, все должно хорошо работать в одном файле размером в несколько десятков или сотен МБ (что вряд ли слишком много для любой файловой системы). У вас также есть произвольный доступ к подмножествам на случай, если он понадобится вам позже.

person Alfe    schedule 29.05.2012
comment
Ах, я пропустил эту «читабельную» часть :-} Может быть, тогда вы не хотите использовать struct.py, а просто старую старую str()/int()/float(). И, конечно же, используйте один файл для каждого массива (вы написали, что у вас их 30). - person Alfe; 29.05.2012