Добавление большого количества данных в базу данных таблиц (HDF5), где Database.numcols! = Newdata.numcols?

StackOverflow https://stackoverflow.com/questions/7327739

  •  27-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь добавить большой набор данных (> 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top