我的np.array太大而无法存储在内存中(34000,34000),因此我需要pytables来将其存储为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.]]
但是,我需要不断更新数组元素。我意识到,由于从table.array继承了。 setitems 方法,因此应该重新分配耳朵。下面是一个简单的代码,用以说明我如何更新行。
我遇到的问题是,重新分配在结束时并不持久
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实际上并不适合这种用例?
答案 0 :(得分:0)
我对TensorFlow并不熟悉,因此只能帮助处理代码中的Pytables调用。是的,您可以在EArray中添加或更新数据。我没有使用EArray.setitems()
方法来修改数据。有一种更简单的方法。只需像使用Numpy索引一样对EArray值进行索引。如果要将数据(行)添加到EArray,请使用EArray.append()方法。在Pytables文档站点上都有这两个示例。查看这些参考资料以获取简短的教程:
pytables.org: Modifying data in tables
pytables.org: Appending data to an existing table
在您的代码中,extended_data
是一个Numpy数组,hdf5_update.root.data[:]
指向磁盘上的HDF5 EArray数据。它是副本,而不是视图。修改extended_data
不会修改 hdf5_update.root.data[:]
。这就是为什么数据不持久的原因。
我创建了一个简单的示例来演示其工作原理。下面的代码将修改磁盘上的数据。修改EArray后,以上输出将显示extended_data
和hdf5_update.root.data[:]
的值不同。磁盘上的数据已修改。在内存中没有数据。向下滚动代码以创建示例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()