Как обновить Earray в pytables? - PullRequest
       101

Как обновить Earray в pytables?

0 голосов
/ 06 сентября 2018

У меня есть np.array, который слишком велик для хранения в памяти (34000, 34000), поэтому мне нужны pytables, чтобы хранить его как Earray. Поскольку я ограничен памятью, я разбил умножение матриц на кусочные умножения, которые затем добавляются к Earray.

Здесь у меня есть более простой пример, где earray состоит из (300, 30000), где каждый элемент равен 9. и я пытаюсь обновить его, вставив целый массив.

 [[9. 9. 9. ... 9. 9. 9.]
 [9. 9. 9. ... 9. 9. 9.]
 [9. 9. 9. ... 9. 9. 9.]
 ...
 [9. 9. 9. ... 9. 9. 9.]
 [9. 9. 9. ... 9. 9. 9.]
 [9. 9. 9. ... 9. 9. 9.]]

Однако мне нужно постоянно обновлять элементы массива. Я понимаю, что ушей должен работать в переназначении, так как он имеет унаследованный. setitems метод из tables.array. Ниже приведен простой код, иллюстрирующий, как я обновляю строки.

Я сталкиваюсь с проблемой, когда переназначение не сохраняется при закрытии

hdf5_epath = 'extendable.hdf5'
hdf5_update = tables.open_file(hdf5_epath, mode='r+')
extended_data = hdf5_update.root.data[:]

sess = tf.Session()
for each in range(len(extended_data)):
    print(extended_data[each])
    abc = tf.ones(34716, tf.float32)
    ones = sess.run(abc)
    extended_data[each] = ones

hdf5_update.close()

Я делаю что-то не так или Pytable на самом деле не предназначен для такого варианта использования.

1 Ответ

0 голосов
/ 05 декабря 2018

Я не знаком с TensorFlow, поэтому могу помочь только с вызовами Pytables в вашем коде.Да, вы можете добавлять или обновлять данные в массиве EArray.Я не использовал метод EArray.setitems() для изменения данных.Есть более простой способ;просто индексируйте значения EArray, как это делается при индексировании Numpy.Если вы хотите добавить данные (строки) в EArray, используйте метод EArray.append ().На сайте документации Pytables есть примеры того и другого.Просмотрите эти ссылки для краткого учебника:
pytables.org: изменение данных в таблицах
pytables.org: добавление данных в существующую таблицу

В вашем коде extended_data является массивом Numpy, а hdf5_update.root.data[:] указывает на данные массива HDF5 на диске.Это копия, а не вид.Изменение extended_data НЕ изменяет hdf5_update.root.data[:].Вот почему данные не являются постоянными.

Я создал простой пример, чтобы показать, как это работает.Код ниже изменит данные на диске.Вывод сверху покажет значения extended_data и hdf5_update.root.data[:] после модификации EArray.Данные ондиска изменены.В памяти данных нет.Прокрутите код вниз, чтобы создать пример файла HDF5.

КОД ДЛЯ ИЗМЕНЕНИЯ БЛИЗКА HDF5 НА МЕСТЕ:

import tables as tb, numpy as np
hdf5_epath = 'extendable.hdf5'
h5f = tb.open_file(hdf5_epath, mode='r+')

extended_data = h5f.root.MyData.X[:]

print (extended_data.dtype, extended_data.shape)

myarray = 9.*np.ones(3*300).reshape((3,300))

h5f.root.MyData.X[0:3, : ] = myarray 
print (extended_data[0,0], extended_data[2,299])
print (h5f.root.MyData.X[0,0], h5f.root.MyData.X[2,299])

h5f.root.MyData.X[-3:, : ] = myarray 
print (extended_data[-1,0], extended_data[-1,299])
print (h5f.root.MyData.X[-1,0], h5f.root.MyData.X[-1,299])

h5f.close()

КОД ДЛЯ СОЗДАНИЯ HDF5, ИСПОЛЬЗОВАННЫЙ ВЫШЕ:
Запустите, чтобы создать extendable.hdf5 используется выше.Я предлагаю вам проверить данные с помощью HDFView до и после запуска каждого сегмента кода.

import tables as tb, numpy as np
hdf5_epath = 'extendable.hdf5'
h5f = tb.open_file(hdf5_epath, mode='a')
dataGroup = h5f.create_group(h5f.root, 'MyData')

myarray = np.arange(30.*300.).reshape((30,300))

X = h5f.create_earray(dataGroup,"X", obj=myarray)                  
print ('flavor =', X.flavor )
print ('dim=', X.ndim, ', rows = ', X.nrows)

myarray = np.arange(30*300+30*300,30*300,-1).reshape((30,300))

X.append( myarray )
print ('dim=', X.ndim, ', rows = ', X.nrows)

Y_1 = X.read( 0 )
print (Y_1.dtype, Y_1.shape)

print (Y_1[0,0])
print (Y_1[-1,-1])

Y_2 = X.read( 1 )
print (Y_2[0,0])
print (Y_2[-1,-1])

h5f.close()
...