问题描述
这是我目前用来打开这个非常大的 matlab 文件的代码:
cat file.txt | grep '^(.*?):'
完全加载大约需要 3-5 分钟。如何改进此代码以加快流程?
解决方法
保存和使用对象很容易。在不知道代码用途的情况下,很难提供有关对象与数组的详细信息。得到变量 <div id="to-do-1"><p>Test</p></div>
<button onclick="myFunction()">Click Me!</button>
<script>
function myFunction() {
document.getElementById("to-do-1").style.display = "inline";
}
</script>
<style>
#to-do-1 {
display: none;
}
</style>
后想做什么?您检索所有数据集,然后继续重新定义 self.data
。最后,您将 self.data
分配给第一个数据集的数组。此外,self.data
指向第二个数据集中的单个值。所以,不清楚你为什么要检索所有这些。
如果你只想要第一个数据集中的数据,这样的事情就可以了。
self.fs
如果您想要所有数据集中的名称和数据,这将返回名称和对象的字典。
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)
然后,当您需要一组数据时,请使用以下方法之一:
f = h5py.File(filepath,'r')
for k,v in f.items():
self.data[k] = v
要了解发生了什么,让我们从一些 HDF5 基础知识开始。使用 HDF5 时理解架构至关重要。数据结构类似于计算机上的文件夹和文件。文件夹是“组”,文件是“数据集”。使用 h5py,您可以使用字典语法访问群组成员,并且使用 NumPy 数组语法访问数据集。 (h5py File 对象的行为类似于 Group。)
因此,当您执行 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][:]
时,h5py 为每个组成员返回 for k,v in f.items()
对(代码中的 key,value
)。 k,v
是对象的名称,key
是 h5py 对象(数据集或其他组)。
拥有数据集后,有 3 种方法可以访问关联数据:
- 您可以简单地保存对象并将其引用为“好像”它是一个 NumPy 数组。
- 您可以保存对象的名称,然后当您需要对象的数据时,您可以使用数据集名称和关联的组进行检索。
- 您可以将数据集值读入 NumPy 数组。 (这就是您的代码所做的。)
注意:我更喜欢方法 #1 和 #2,因为它们在您读取数据之前,它们不会将数据加载到内存中。
这是您的代码以及我对每个步骤的评论:
value