Добавление большого количества данных в базу данных таблиц (HDF5), где Database.numcols! = Newdata.numcols?
Вопрос
Я пытаюсь добавить большой набор данных (> 30 ГБ) к существующей таблице Pytables. Таблица составляет n столбцов, а набор данных-столбцы n-1; Один столбец рассчитывается после того, как я знаю другие столбцы N-1.
я использую numpy.fromfile()
Чтобы прочитать куски набора данных в память, прежде чем добавить его в базу данных. В идеале я хотел бы вставить данные в базу данных, затем вычислить окончательный столбец и закончить, используя Table.modifyColumn()
Чтобы завершить операцию.
Я подумал о добавлении numpy.zeros((len(new_data), N))
к таблице, затем используя Table.modifyColumns()
Чтобы заполнить новые данные, но я надеюсь, что кто -то знает хороший способ избежать генерирования огромного множества пустых данных для каждой части, которую мне нужно добавить.
Решение
Если столбцы - все один и тот же тип, вы можете использовать numpy.lib.stride_tricks.as_strided
Чтобы сделать массив, который вы читаете из файла формы (L, N-1), чтобы выглядеть как форма (L, N). Например,
In [5]: a = numpy.arange(12).reshape(4,3)
In [6]: a
Out[6]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
In [7]: a.strides
Out[7]: (24, 8)
In [8]: b = numpy.lib.stride_tricks.as_strided(a, shape=(4, 4), strides=(24, 8))
In [9]: b
Out[9]:
array([[ 0, 1, 2, 3],
[ 3, 4, 5, 6],
[ 6, 7, 8, 9],
[ 9, 10, 11, 112]])
Теперь вы можете использовать этот массив b
Чтобы заполнить стол. Последний столбец каждой строки будет таким же, как первый столбец следующей строки, но вы перезаписываете их, когда сможете вычислить значения.
Это не сработает, если a
это массив записей (т.е. имеет сложный dtype). Для этого вы можете попробовать numpy.lib.recfunctions.append_fields
. Анкет Поскольку он скопирует данные в новый массив, он не сохранит вам какого -либо значительного количества памяти, но позволит вам выполнить все письмо одновременно.
Другие советы
Вы можете добавить результаты в другую таблицу. Если нет какой -то убедительной причины, чтобы рассчитанная колонка была рядом с другими столбцами, это, вероятно, самая легкая. Есть что -то, что можно сказать о отделении необработанных данных от расчетов.
Если вы должны увеличить размер таблицы, посмотрите на использование H5Py. Анкет Это обеспечивает более прямой интерфейс для файла H5. Имейте в виду, что в зависимости от того, как был создан набор данных в файле H5, может быть невозможно просто добавить столбец в данные. См. Раздел 1.2.4, «Dataspace» в http://www.hdfgroup.org/hdf5/doc/ug/03_datamodel.html Для обсуждения общего формата данных. H5Py поддерживает Изменение размера Если базовый набор данных поддерживает его.
Вы также можете использовать один буфер для хранения входных данных, как SO:
z = zeros((nrows, N))
while more_data_in_file:
# Read a data block
z[:,:N-1] = fromfile('your_params')
# Set the final column
z[:,N-1:N] = f(z[:,:N-1])
# Append the data
tables_handle.append(z)