首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何打开大(2 2GB)文件并更快地预先计算?

如何打开大(2 2GB)文件并更快地预先计算?
EN

Stack Overflow用户
提问于 2021-04-09 12:26:05
回答 1查看 57关注 0票数 0

这是我目前用来打开这个非常大的matlab文件的代码:

代码语言:javascript
运行
复制
self.data = {}
f = h5py.File(filepath, 'r')
for k, v in f.items():
    self.data[k] = np.array(v)
self.data = list(self.data.items())
self.data = np.array(self.data)
self.fs = self.data[1][1][0][0]
self.data = self.data[0][1]

print('fs = ', self.fs)
print('DONE. Data read using h5py reader')

大约需要3-5分钟才能完全加载。我怎样才能改进这段代码来加速这个过程呢?

EN

回答 1

Stack Overflow用户

发布于 2021-04-13 04:20:40

保存和使用对象很容易。如果不知道代码的用途,就很难提供关于对象和数组的详细信息。在获得变量self.data之后,你想对它做什么?检索所有数据集,然后不断重新定义self.data。最后,将self.data分配给第一个数据集的数组。此外,self.fs指向第二个数据集中的单个值。因此,还不清楚为什么要检索所有这些数据。

如果您只需要第一个数据集中的数据,下面这样的代码就可以满足您的需求。

代码语言:javascript
运行
复制
f = h5py.File(filepath, 'r')
# returns first key from group member names:
dsname = next(iter(f))    #  (name of 1st dataset)
self.data = f[dsname][:]  #  (data from 1st dataset)

如果您想要所有数据集中的名称和数据,这将返回名称和对象的字典。

代码语言:javascript
运行
复制
f = h5py.File(filepath, 'r')
for k, v in f.items():
    self.data[k] = v 

然后,当您需要一个数据数组时,使用以下方法之一:

代码语言:javascript
运行
复制
arr = data['a dataset name'][:]  # for 1 dataset (when you know the name)
for dsname, obj in data.items():  # loop thru all pairs in data
    arr = obj[:]  # or
    arr = f[dsname][:]

为了理解发生了什么,让我们从一些HDF5基础知识开始。在使用HDF5时,理解模式是至关重要的。数据结构类似于计算机上的文件夹和文件。文件夹是“组”,文件是“数据集”。通过h5py,您可以使用字典语法对访问组成员进行访问,并使用数组语法对数据集进行访问。( h5py文件对象的行为类似于一个组。)

因此,当您执行for k,v in f.items()时,h5py将为每个组成员返回key,value对(在您的代码中为k,v)。key是对象的名称,value是h5py object (数据集或另一个组)。

一旦有了数据集,有3种方法可以访问相关数据:

  1. 您可以简单地保存对象并引用它,如果它是一个NumPy数组。
  2. 您可以保存对象的名称,然后当您需要对象的数据时,您可以使用数据集名称和关联的组进行检索。
  3. 您可以将数据集值读取到NumPy数组中。(这就是您的代码所做的。)

注意:我更喜欢方法#1和#2,因为它们在读取数据之前不会将数据加载到内存中。

这是你的代码和我对每一步的评论:

代码语言:javascript
运行
复制
# returns a file object "f" (behaves like a group):
f = h5py.File(filepath, 'r')
# returns key/value pairs of group member names/objects:
for k, v in f.items():
    # adds a dictionary key (object name) with value of an array read from object "v":
    self.data[k] = np.array(v)
# converts the (name,array) dictionary into a list:
self.data = list(self.data.items())
# converts the list into a nd.array of dtype=object:
#    -has 1 row for each dataset with 2 columns: 
#    -column 0: object name, column 1: array of data 
self.data = np.array(self.data)
# reads [0][0] value from array at self.data[1][1] ([0][0] value for 2nd dataset)
self.fs = self.data[1][1][0][0]
# resets data to value from array at self.data[0][1] (array for 1st dataset)
self.data = self.data[0][1]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67015050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档