h5py中的双端队列

时间:2019-05-18 19:34:36

标签: python deque h5py

在我的项目中,我使用python的双端队列作为有限的缓冲区。问题是缺少RAM。这就是为什么我要寻找一种解决方案,而一个选择是将缓冲区存储在HDD上。

我想知道是否有可能在h5py的数据集中启用有限的双端队列。

欢迎任何建议。

1 个答案:

答案 0 :(得分:0)

根据docs数据集,甚至不支持追加

  

简短的响应是h5py类似于NumPy,而不是数据库。   与HDF5数据包表接口(和PyTables)不同,它没有   附加行的概念。

所以我本人已经实现了期望的行为:

import h5py
import numpy as np

class H5Buffer():
    def __init__(self, array_shape, maxlen, dtype):
        self.maxlen = maxlen
        self.current_idx = 0

        self.file = h5py.File("buffer.hdf5", "w")
        self.buffer =  self.file.create_dataset('buffer', (0,)+array_shape, maxshape=(maxlen,)+array_shape, dtype=dtype)        

    def append(self, array):
        '''
        array is numpy array with the shape of array_shape
        '''
        add_size = array.shape[0]
        if self.buffer.shape[0]<self.maxlen:
            self._resize(self.buffer.shape[0], add_size)

        add_idx = add_size
        end_idx = self.current_idx + add_idx

        if end_idx >= self.maxlen:
            add_idx-= end_idx - self.maxlen
            end_idx = self.maxlen

        self.buffer[self.current_idx:end_idx] = array[:add_idx]

        self.current_idx = end_idx
        if self.current_idx == self.maxlen:
            self.current_idx = 0
        if add_idx != add_size:
            self.append(array[add_idx:])

    def _resize(self, current_size, add_size):
        new_size = current_size + add_size
        if new_size > self.maxlen:
            new_size = self.maxlen
        self.buffer.resize(new_size, axis=0)

    def sample(self, start_idx, end_idx):
        return self.buffer[start_idx:end_idx]

    def length(self):
        return len(self.actions)

    def close(self):
        if self.file:
            self.file.close()
        self.file = None

    def __del__(self):
        self.close()