我将一个巨大的序列(1000000)的小矩阵(32x32)存储在一个hdf5文件中,每个矩阵都有一个标签。这些矩阵中的每个矩阵表示特定时间的传感器数据。
我想要获得每个像素在一个小时间片内的演变,对于矩阵中的每个x,y位置都不同。
这比我预期的花费了更多的时间。
def getPixelSlice (self,xpixel,ypixel,initphoto,endphoto):
#obtain h5 keys inside time range between initphoto and endphoto
valid=np.where(np.logical_and(self.photoList>=initphoto,self.photoList<endphoto))
#look at pixel data in valid frames
evolution = []
#for each valid frame, obtain the data, and append the target pixel to the list.
for frame in valid[0]:
data = self.h5f[str(self.photoList[frame])]
evolution.append(data[ypixel][xpixel])
return evolution,valid发布于 2017-03-28 00:34:48
所以,这里有一个问题,我花了一段时间来整理类似的应用程序。由于硬盘驱动器的物理限制,数据以这样一种方式存储,即使用三维数组,在一个方向上总是比在另一个方向上更容易读取。这完全取决于您存储数据的顺序。
如何处理此问题取决于您的应用程序。我的特定应用程序可以被描述为“写得少,读得多”。在这种情况下,以我期望读取数据的顺序存储数据是最有意义的。为此,我使用PyTables并指定一个与我的时间序列相同的“块形状”。因此,在您的情况下,它将是(1,1,1000,000)。不过,我不确定这个大小是否太大,所以您可能需要进一步细分它,比如(1,1,10000)或类似的东西。
For more info see PyTables Optimization Tips.
对于需要多次读取特定方向的应用程序,为HDF5数组选择合适的卡盘形状至关重要。
https://stackoverflow.com/questions/43051678
复制相似问题