相关疑难解决方法(0)

h5py:切片阵列数据集的正确方法

我在这里有点困惑:

据我所知,h5py的.value方法读取整个数据集并将其转储到一个数组中,这个数组很慢而且不鼓励(通常应该替换为[()].正确的方法是使用numpy-esque切片.

但是,我得到了令人不快的结果(使用h5py 2.2.1):

import h5py
import numpy as np
>>> file = h5py.File("test.hdf5",'w')
# Just fill a test file with a numpy array test dataset
>>> file["test"] = np.arange(0,300000)

# This is TERRIBLY slow?!
>>> file["test"][range(0,300000)]
array([     0,      1,      2, ..., 299997, 299998, 299999])
# This is fast
>>> file["test"].value[range(0,300000)]
array([     0,      1,      2, ..., 299997, 299998, 299999])
# This is also fast
>>> file["test"].value[np.arange(0,300000)]
array([     0,      1,      2, ..., 299997, 299998, 299999])
# This …
Run Code Online (Sandbox Code Playgroud)

python numpy h5py

11
推荐指数
1
解决办法
9667
查看次数

读取行的最佳HDF5数据集块形状

我有一个合理的大小(压缩后的18GB)HDF5数据集,并希望优化读取行的速度。形状为(639038,10000)。我将多次读取整个数据集中的选定行(例如〜1000行)。所以我不能使用x:(x + 1000)来切片行。

使用h5py从内存不足的HDF5中读取行已经很慢,因为我必须传递一个排序列表并求助于高级索引。有没有一种方法可以避免花式索引,或者我可以使用更好的块​​形状/大小?

我已经阅读了一些经验法则,例如1MB-10MB的块大小,并且选择了与我所读内容一致的形状。但是,构建大量具有不同块形状的HDF5文件进行测试在计算上非常昂贵且非常缓慢。

对于每个〜1,000行的选择,我立即将它们求和以获得长度10,000的数组。我当前的数据集如下所示:

'10000': {'chunks': (64, 1000),
          'compression': 'lzf',
          'compression_opts': None,
          'dtype': dtype('float32'),
          'fillvalue': 0.0,
          'maxshape': (None, 10000),
          'shape': (639038, 10000),
          'shuffle': False,
          'size': 2095412704}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过的东西:

  • 用块形状(128,10000)重写数据集(据我估计约为5MB)太慢了。
  • 我看了dask.array进行了优化,但是由于〜1,000行很容易容纳在内存中,所以我看不到任何好处。

python performance hdf5 dataset h5py

2
推荐指数
1
解决办法
3105
查看次数

保存到hdf5非常慢(Python冻结)

我正在尝试将瓶颈值保存到新创建的hdf5文件中。瓶颈值成批出现(120,10,10, 2048)。单独保存一个批处理将占用超过16个演出,而python似乎在冻结该批处理。根据最近的发现(请参阅更新,看来hdf5占用大内存是可以的,但是冻结的部分似乎是一个小故障。

我只是想保存前批用于测试目的,而只保存训练数据集(再一次,这是一次测试运行),但是我什至不能超过第一批。它只会在第一批中停顿,并且不会循环到下一个迭代。如果我尝试检查hdf5,资源管理器将变慢,Python将冻结。如果我尝试杀死Python(即使不检查hdf5文件),Python也无法正确关闭,并且会强制重启。

以下是相关的代码和数据:

总数据点约为90,000 ish,分120个批次发布。

Bottleneck shape is (120,10,10,2048)
Run Code Online (Sandbox Code Playgroud)

所以我要保存的第一批是 (120,10,10,2048)

这是我尝试保存数据集的方式:

with h5py.File(hdf5_path, mode='w') as hdf5:
                hdf5.create_dataset("train_bottle", train_shape, np.float32)
                hdf5.create_dataset("train_labels", (len(train.filenames), params['bottle_labels']),np.uint8)
                hdf5.create_dataset("validation_bottle", validation_shape, np.float32)
                hdf5.create_dataset("validation_labels",
                                              (len(valid.filenames),params['bottle_labels']),np.uint8)



 #this first part above works fine

                current_iteration = 0
                print('created_datasets')
                for x, y in train:

                    number_of_examples = len(train.filenames) # number of images
                    prediction = model.predict(x)
                    labels = y
                    print(prediction.shape) # (120,10,10,2048)
                    print(y.shape) # (120, 12)
                    print('start',current_iteration*params['batch_size']) # 0
                    print('end',(current_iteration+1) * params['batch_size']) # 120

                    hdf5["train_bottle"][current_iteration*params['batch_size']: (current_iteration+1) * params['batch_size'],...] …
Run Code Online (Sandbox Code Playgroud)

python numpy hdf5 keras

1
推荐指数
1
解决办法
2034
查看次数

标签 统计

python ×3

h5py ×2

hdf5 ×2

numpy ×2

dataset ×1

keras ×1

performance ×1