创建一个简单的数据库来存储和加载随机数的高维 numpy 数组的好方法是什么?

What is a good way to create a simple database to store and load a random number of high-dimensional numpy arrays?

一个计算过程创建了一个随机数的numpy数组,我想方便地将每个数组保存并加载到硬盘上。重要的是,文件是高维的,数组的形状本身是随机的。

为了保存和加载每个数组,我创建了以下接口:

class Filesaver:

    def __init__(self, filename: str):
        self._filename = filename
        try:
            f = open(self._filename, 'rb')
            self._pos = self._get_len(f)
        except FileNotFoundError:
            self._pos = 0

    def _get_len(self, file) -> int:
        pos = 0
        while True:
            try:
                pickle.load(file)
                pos += 1
            except EOFError:
                break
        return pos

    def save(self, data: np.ndarray) -> None:
        """Pickles the obejct to hdd """
        with open(self._filename, 'ab+') as f:
            pickle.dump(data, f)
            self._pos += 1

    def __getitem__(self, idx: int) -> np.ndarray:
        assert idx < self._pos, EOFError("File is not long enough")
        with open(self._filename, 'rb') as f:
            tmp = 0
            while tmp <= idx:
                data = pickle.load(f)
                tmp += 1
        return data

    def __len__(self) -> int:
        return self._pos

该界面允许将另一个数组附加到现有数据库并加载每个元素。但是,这个方法对我来说似乎有点奇怪:首先,要使用 __getitem__ 方法加载数组,我必须循环遍历文件并且不能直接打开元素 idx 。其次,保存对象中元素的初始数量在 _get_len 循环文件直到发生错误的方法中确定。

有没有人有更好的主意来将随机数(高维)的 numpy 数组保存到硬盘或从硬盘加载?

您可以使用 h5py (or alternatively PyTables).

您将找到 here 如何使用 h5py 的简短示例。更多文档可在其网站上找到。